我有两个文件,一个包含模式列表,另一个需要根据这些模式进行更改。到目前为止,我一直在尝试
cat patterns.txt| xargs -n1| sed 's/patternfromfile/subtitution/'
但我不确定如何将 xargs 输入到 's/here//'
谢谢
答案1
您可能需要 xargs 的 -i 选项(有关详细信息,请查看手册页)。这本质上是{}
用模式替换,并针对每个模式运行一次命令。因此,它将针对每个模式对文件运行一次 sed;在创建模式时,您需要牢记这一点。
user@host [/tmp]$ cat patterns
a
[pd]ie
user@host [/tmp]$ cat file
hat
cherry pie
die alone
eat cake
user@host [/tmp]$ cat patterns | xargs -i sed 's/{}/moo/' file
hmoot
cherry pie
die moolone
emoot cake
hat
cherry moo
moo alone
eat cake
或者,您可以使用其他东西从模式文件动态构建 sed 脚本。例如,您可以在模式文件上使用 sed 以一次性将它们全部应用于文件。:)
user@host [/tmp]$ sed 's|^|s/|;s|$|/moo/;|' patterns | tee patterns.sed
s/a/moo/;
s/[pd]ie/moo/;
user@host [/tmp]$ sed -f patterns.sed file
hmoot
cherry moo
moo moolone
emoot cake
答案2
您可以构建这样的正则表达式:
regex=$(tr '\n' '|' < patterns.txt)
sed -ri "s/$regex/replacement/" filename
您可以选择将“g”标志添加到 s/// 命令。
答案3
不知道你有什么模式:
如果您想直接编辑文件,请使用 -i 选项:
while read pattern
do
sed -i 's/"${pattern}"/substitution/' yourfile
done < patterns.txt
或者将输出重定向到新文件:
while read pattern
do
sed 's/"${pattern}"/substitution/' yourfile >> outfile
done < patterns.txt