在包含 string3 的行中将 string1 替换为字符串 2 - string1 多次出现

在包含 string3 的行中将 string1 替换为字符串 2 - string1 多次出现

我使用以下命令替换包含另一个字符串 (string3) 的行中的特定字符串(将 string1 替换为 string2)。

  sed -i '/string3/ s/string1/string2/' file.txt

问题...

上面的命令工作正常 - 但是 - 它仅在包含 string3 的行中第一次出现 string1 时将 string1 替换为 string2。

我必须多次运行该命令以确保所有出现的 string1 都被替换。

  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt
  sed -i '/string3/ s/string1/string2/' file.txt

有没有办法一步替换包含 string3 的行中所有出现的 string1 ?

这可以帮助我缩小 bash 文件。

十分感谢。

答案1

您需要做的就是将 sed 的“全局替换”标志添加到末尾:

sed -i '/string3/ s/string1/string2/g' file.txt

答案2

为了完整起见,虽然这种情况下明显的解决方案是添加标志g,但在某些情况下您可能需要多次运行s/string1/string2/(或) 命令。s/string1/string2/g

例如,如果string2您的str输入不是 ,而是 , ,例如:

string1ing1

s/string1/str/g将导致:

string1

如果您想要str,则需要另一个s/string1/str/g.对于sed,只要使用以下t命令成功,就有一种惯用的方式来运行替换:

sed '
  /string3/{
    :1
    s/string1/string2/
    t1
  }'

t:1仅当命令成功时才分支到标签s

答案3

虽然问题被标记为sed并在上面给出了完美的答案,但这里是 awk 版本,供那些会寻找它的人使用。

awk '/string3/{gsub("string1", "string2", $0)}1' infile.txt 

相关内容