Sed第二次更换

BeG*_*een 5 regex bash sed non-greedy

我想用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
Run Code Online (Sandbox Code Playgroud)

需要输出:

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
Run Code Online (Sandbox Code Playgroud)

这是我试过的:

sed -r 's/(\(null)\).*csv//' file.csv
Run Code Online (Sandbox Code Playgroud)

这里的问题是正则表达式太贪婪,但我不能让它停止.我也试过这个,跳过第一次出现的"null":

sed -r '0,/null/! s/(\(null)\).*csv//' file.csv
Run Code Online (Sandbox Code Playgroud)

也试过,但贪婪的正则表达式仍然是问题.

sed -r 's/(\(null)\).*csv//2' file.csv
Run Code Online (Sandbox Code Playgroud)

我读过,?可以让正则表达式"懒惰",但我不能让它锻炼.

sed -r 's/(\(null)\).*?csv//' file.csv
Run Code Online (Sandbox Code Playgroud)

Sun*_*eep 7

sed确实提供了一种指定要替换的匹配的简便方法.只需在分隔符后添加数字即可

$ sed 's/(null)[^.]*\.csv//2' ip.csv
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

$ # or [^,] if there are no , within fields
$ sed 's/(null)[^,]*//2' ip.csv
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
Run Code Online (Sandbox Code Playgroud)

此外,()不使用扩展正则表达式时无需转义

  • 好吧,我没有注意到您尝试过“//1”(后来编辑为“//2”)...所以您只是被贪婪的问题推迟了...在这种情况下很容易解决,因为有解决方法使用 `[^,]` 或 `[^.]`...对于一般情况,您可能需要 perl/python/etc 中可用的适当 csv 解析器 (2认同)

Rom*_*est 0

更强大的awk解决方案:

扩展示例文件input.csv

12,Name(null)randomstuff.csv,2,3,Name(null)randomstuff.csv, false,Name(null)randomstuff.csv
12,Name(null)AotherRandomStuff.csv,2,3,Name(null)AotherRandomStuff.csv, false,Name(null)randomstuff.csv
12,Name(null)alphaNumRandom.csv,2,3,Name(null)alphaNumRandom.csv, false,Name(null)randomstuff.csv
Run Code Online (Sandbox Code Playgroud)

工作:

awk -F, '{ c=0; for(i=1;i<=NF;i++) if($i~/\(null\)/ && c++==1) sub(/\(null\).*/,"",$i) }1' OFS=',' input.csv
Run Code Online (Sandbox Code Playgroud)

输出:

12,Name(null)randomstuff.csv,2,3,Name, false,Name(null)randomstuff.csv
12,Name(null)AotherRandomStuff.csv,2,3,Name, false,Name(null)randomstuff.csv
12,Name(null)alphaNumRandom.csv,2,3,Name, false,Name(null)randomstuff.csv
Run Code Online (Sandbox Code Playgroud)