【发布时间】:2017-09-15 11:47:00
【问题描述】:
我想用 sed 删除一个模式,仅在第二次出现时。这是我想要的,删除一个模式,但在第二次出现时。
file.csv 中有什么:
a,Name(null)abc.csv,c,d,Name(null)abc.csv,f
a,Name(null)acb.csv,c,d,Name(null)acb.csv,f
a,Name(null)cba.csv,c,d,Name(null)cba.csv,f
想要的输出:
a,Name(null)abc.csv,c,d,Name,f
a,Name(null)acb.csv,c,d,Name,f
a,Name(null)cba.csv,c,d,Name,f
这是我尝试过的:
sed -r 's/(\(null)\).*csv//' file.csv
这里的问题是正则表达式太贪心,但我不能停止。 我也试过这个,跳过“null”的第一次出现:
sed -r '0,/null/! s/(\(null)\).*csv//' file.csv
也试过了,但贪婪的正则表达式仍然是问题。
sed -r 's/(\(null)\).*csv//2' file.csv
我读到? 可以使正则表达式“懒惰”,但我不能让它锻炼。
sed -r 's/(\(null)\).*?csv//' file.csv
【问题讨论】:
-
如果您可能有 3 个或更多
(null)s 并且您仍然想只删除第二次出现,我认为使用 perl 会更容易,使用.*?而不是.*.
标签: regex bash sed non-greedy