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

Ste*_* B. 17 sed regular-expression

是否可以在一个班轮中完成?

我有这样的输出:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  
Run Code Online (Sandbox Code Playgroud)

此输入是自动生成的。

我想用每行的(引号)替换第一次出现的"(引号+空格)"。如果我在全局范围内应用替换,它也会更改line" -to 的每次出现line"-,所以我想知道是否可以使用 sed one liner 来完成此操作。

我已经尝试使用^这样的

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'
Run Code Online (Sandbox Code Playgroud)

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

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

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

我在这里缺少什么?

gee*_*aur 35

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

sed 's/^" /"/'
Run Code Online (Sandbox Code Playgroud)

  • 完全不同意上述评论;诸如“N”之类的多行“sed”命令和诸如“:a”之类的标签根本没有过时,它们*是*可移植的[并且指定了 POSIX](http://pubs.opengroup.org/onlinepubs/9699919799 /utilities/sed.html),与 Perl/Python/Ruby/whatever 不同。然而,如果您发现自己经常*需要*它们,那么您确实应该[学习`awk`](http://www.grymoire.com/Unix/Awk.html)。 (2认同)

spe*_*rum 5

一个更一般的答案,因为我无法评论 geekosaur 的答案 - 你不会放置 ^ (行锚点的开头)。例如,如果您想用 B 替换第一次出现的 A,您可以

sed 's/A/B/'
Run Code Online (Sandbox Code Playgroud)