用sed替换文件中所有行的模式中第一次出现的模式


16

是否可以在一个衬管中完成?

我有这样的输出:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

此输入是自动生成的。

我想""(引号)替换每行的第一次出现(引号+空格)。如果我全局应用替换,它也会更改每次出现的line" -情况line"-,因此我想知道是否可以使用sed一个衬垫来完成此操作。

我已经尝试使用^这样的

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

但是它不起作用,它不能替代任何东西。我试过了

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

并替换所有出现的事件。我刚刚开始使用sed,所以我真的不知道我做错了什么。

我在这里想念什么?


关于标签的注意事项:上面编写的命令可能在的某些实现中有效sed,但是出于可移植性和避免真正奇怪的错误,您应在标签后添加给定的命令参数(如果需要的话)。例如,sed -e ':a' -e 'N;$!ba' -e 'whatever'
通配符

Answers:


34

您想得太多了。 sed默认情况下,仅替换行中的第一个实例(不带/g修饰符),尽管您仍然希望锚定,因为您不希望锚定;因此,您并不需要行中的第一个实例作为行开头的第一个实例;而且您通常不需要尝试使用的显式行操作(为什么?)。

sed 's/^" /"/'

谢谢!我认为有必要在处理文件时显式声明行操作,阅读并继续使用它们。我真的想得太多了,这再简单不过了,它可以解决问题:)
Steve B.

我很想说那些命令已经过时了。可以用它们来做相当复杂的多行事情,但是这样做并不容易,而如今,使用perl / python / ruby​​ / whatever确实更好。
geekosaur 2012年

完全不同意以上评论;与Perl / Python / Ruby / whatever不同,sed诸如N和之类的多行命令:a根本不会过时,它们可移植的,并且指定了POSIX。但是,的确,如果您发现自己经常需要它们,则应该学习awk
通配符

2

比较笼统的答案,因为我无法评论geekosaur的答案-您不会输入^(行锚的开始)。例如,如果要将A的第一个匹配项替换为B,则可能需要

sed 's/A/B/'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.