如何更改sed'/ {/ b; / pattern / {s // replacement / ;: a; n; ba}'以便它替换文件中的每个出现?

时间:2014-10-25 01:46:57

标签: bash sed

我可以使用sed 's/pattern/replacement/g file.txt将每次出现的“模式”替换为“file.txt中的替换。

根据How to find and replace, skipping lines containing a particular character?,我可以使用sed '/{/b;/pattern/{s//replacement/;:a;n;ba}' file.txt将第一次出现的“pattern”替换为“replacement”,但不能在行上找到“{”时。

我可以在哪里向sed '/{/b;/pattern/{s//replacement/;:a;n;ba}' file.txt添加“g”,以便用“替换”替换所有出现的“pattern”,而不是在行上找到“{”,而不仅仅是第一次出现?

2 个答案:

答案 0 :(得分:1)

你可以尝试下面的awk命令。

awk '!/{/{gsub(/pattern/, "replacement")}1' file

<强>解释

  • !/{/请勿在包含{符号的行上执行以下功能( gsub )。
  • gsub(/pattern/, "replacement")pattern字符串全局替换为replacement
  • 1处理完所有功能后打印所有行。

一个丑陋的sed命令。

sed  '/^[^\{]*$/s/pattern/replacement/g' file

示例:

$ cat file
gchg { pattern pattern
hghg pattern
pattern pattern
$ awk '!/{/{gsub(/pattern/, "replacement")}1' file
gchg { pattern pattern
hghg replacement
replacement replacement
$ sed '/^[^\{]*$/s/pattern/replacement/g' file
gchg { pattern pattern
hghg replacement
replacement replacement

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '/{/b;/pattern/s//replacement/g' file

pattern替换为replacement,但包含{的行除外。