我需要在sed中使用命令的输出作为搜索模式。我将使用echo做一个例子,但假设这可能是一个更复杂的命令:
echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt
该命令不起作用,因为“某些模式”有一个空格,但我认为这清楚地说明了我的问题。
如何使该命令有效?
提前致谢,
答案 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
的一部分,否则正则表达式将无法正确形成。