单个sed命令用于多个替换?

Asa*_*saf 2 sed substitution

我使用sed替换文件中的文本.我想给sed一个文件,其中包含要在给定文件中搜索和替换的所有字符串.

它遍历.h和.cpp文件.在每个文件中,它搜索包含在其中的文件名.如果找到,它将"ah"替换为"<ah>"(不带引号).

脚本是这样的:

For /F %%y in (all.txt) do 
   for /F %%x in (allFilesWithH.txt) do
       sed -i s/\"%%x\"/"\<"%%x"\>"/ %%y
Run Code Online (Sandbox Code Playgroud)
  • all.txt - 要在其中进行替换的文件列表
  • allFilesWithH.txt - 要搜索的所有包含名称

我不想多次运行sed(作为input.txt中文件名的数量.)但我想运行一个sed命令并将其作为输入传递给input.txt.

我该怎么做?

PS我从VxWorks开发shell运行sed,因此它没有Linux版本的所有命令.

Pet*_*sen 5

您可以消除其中一个循环,因此sed每个文件只需要调用一次.使用该-f选项指定多个替换:

For /F %%y in (all.txt) do 
    sed -i -f allFilesWithHAsSedScript.sed %%y
Run Code Online (Sandbox Code Playgroud)

allFilesWithHAsSedScript.sed派生自allFilesWithH.txt并将包含:

s/\"file1\"/"\<"file1"\>"/
s/\"file2\"/"\<"file2"\>"/
s/\"file3\"/"\<"file3"\>"/
s/\"file4\"/"\<"file4"\>"/
Run Code Online (Sandbox Code Playgroud)

(在文章Common threads:Sed by example,Part 3中有很多sed脚本的例子和解释.)

不要被混淆(双关语).


Cas*_*bel 4

sed本身没有能力从文件中读取文件名。我不熟悉 VxWorks shell,我想这与缺乏答案有关......所以这里有一些可以在 bash 中工作的东西 - 也许 VxWorks 会支持其中之一。

sed -i 's/.../...' `cat all.txt`

sed -i 's/.../...' $(cat all.txt)

cat all.txt | xargs sed -i 's/.../...'
Run Code Online (Sandbox Code Playgroud)

sed事实上,如果它能完成工作,调用几次也没什么大不了的:

cat all.txt | while read file; do sed -i 's/.../.../' $file; done

for file in $(cat all.txt); do   # or `cat all.txt`
    sed -i 's/.../.../' $file
done
Run Code Online (Sandbox Code Playgroud)