我有一个 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/