gpt4 book ai didi

regex - sed 命令删除文本,直到为 csv 的每一行找到匹配项

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:58 34 4
gpt4 key购买 nike

我有一个 csv 文件,我试图从该行的开头删除所有字符,直到它找到第一次出现的“2015”。我想对 csv 文件中的每一行执行此操作。

我的csv文件结构如下:

Field1 , Field2 , Field3 , Field4
sometext1 , 2015-07-15 , sometext2, sometext3
sometext1 , 2015-07-14 , sometext2, sometext3
sometext1 , 2015-07-13 , sometext2, sometext3

我不能对第一次出现的逗号使用 cut 命令或 sed,因为 Field1 中的文本有时也会包含逗号,这使得解析变得复杂。我想如果我为每一行搜索文本 2015 的第一次出现并将前面的所有字符替换为空字符,那么这应该可行。

仅供引用,我只想在 2015 年第一次出现时执行此操作。另一列中有另一个包含 2015 年的文本字段,在此之前的任何文本都不会受到影响。

例如,如果我的原始行是:

sometext1,#015,2015-07-10,sometext2,2015,sometext3

我希望它返回:

2015-07-10,sometext2,2015,sometext3

有人知道执行此操作的 sed 命令吗?

任何帮助将不胜感激!

谢谢

最佳答案

假设“#####”从未出现在一行中,这是使用 sed 的一种方法:

sed -e 's/2015/#####&/'|sed -e 's/.*#####//'

例如:

> echo sometext1,#015,2015-07-10,sometext2,2015,sometext3\
|sed -e 's/2015/#####&/'|sed -e 's/.*#####//'
2015-07-10,sometext2,2015,sometext3

第一个 sed 命令将“#####”作为 2015 年第一次出现的前缀,第二个 sed 命令删除从“#####”前缀开始到结束的所有内容。

使用这种两阶段方法的基本原因是 sed 的正则表达式匹配器只有总是选择最长匹配的贪婪通配符,不支持选择最短匹配的惰性匹配。

如果“#####”可能出现在一行中,则可以用更不可能的字符串代替它,例如“7z#dNjm_wG8a3!esu@Rhv="。

关于regex - sed 命令删除文本,直到为 csv 的每一行找到匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31439661/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com