繁体   English   中英

sed命令删除文本,直到找到csv的每一行都匹配

[英]sed command to delete text until match is found for each line of a csv

我有一个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 =“。

要使用不带Perl样式非贪婪运算符的sed来执行此操作,您需要使用Tris所描述的标记您知道的第一个实例。 但是,该解决方案需要了解文件中不会包含的内容。 幸运的是,您可以保证换行符不会出现在行中,因为这是终止行的原因。 因此,您可以执行以下操作:

sed 's/2015/\n&/;s/.*\n//' input.txt > output.txt

注意:这不会修改您必须特别对待的标题行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM