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

时间:2009-10-05 13:00:18

标签: sed substitution

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

它遍及.h和.cpp文件。在每个文件中,它搜索包含在其中的文件名。如果找到,它用“< a.h>”代替例如“a.h” (没有引号)。

脚本是这样的:

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

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

我该怎么做?

P.S我从VxWorks Development shell运行sed,因此它没有Linux版本的所有命令。

3 个答案:

答案 0 :(得分:5)

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

For /F %%y in (all.txt) do 
    sed -i -f allFilesWithHAsSedScript.sed %%y

allFilesWithHAsSedScript.sed派生自allFilesWithH.txt,其中包含:

s/\"file1\"/"\<"file1"\>"/
s/\"file2\"/"\<"file2"\>"/
s/\"file3\"/"\<"file3"\>"/
s/\"file4\"/"\<"file4"\>"/

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

不要被混淆(双关语)。

答案 1 :(得分: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/.../...'

实际上,如果完成工作,多次调用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

答案 2 :(得分:0)

我要做的是使用sed将allFilesWithH.txt更改为sed命令。

(当强制使用sed。我实际上使用Perl,它也可以搜索* .h文件。)