我使用以下命令替换包含另一个字符串 (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