如何在搜索模式中使用带有sed的xargs

时间:2013-01-18 16:12:14

标签: bash sed replace pipeline

我需要在sed中使用命令的输出作为搜索模式。我将使用echo做一个例子,但假设这可能是一个更复杂的命令:

echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt

该命令不起作用,因为“某些模式”有一个空格,但我认为这清楚地说明了我的问题。

如何使该命令有效?

提前致谢,

4 个答案:

答案 0 :(得分:18)

你需要告诉xargs用-I开关替换什么 - 它似乎不会自动了解{},至少在某些版本中是这样。

echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt

答案 1 :(得分:7)

这适用于Linux(已测试):

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g' 

答案 2 :(得分:5)

请改用命令替换,因此您的示例如下所示:

sed -i "s/$(echo "some pattern")/replacement/g" file.txt

双引号允许命令替换工作,同时防止空格被分割。

答案 3 :(得分:0)

这可能适合你(GNU sed):

echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

基本上将some pattern转换为sed替换命令,并通过管道将其提供给另一个sed调用。最后一个sed调用使用-f开关,该开关通过文件接受sed命令,在这种情况下,文件是标准输入-

如果您使用的是bash,则可以使用here-string

<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

N.B。 sed分隔符|/不应该是some pattern的一部分,否则正则表达式将无法正确形成。