我使用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)
我不想多次运行sed(作为input.txt中文件名的数量.)但我想运行一个sed命令并将其作为输入传递给input.txt.
我该怎么做?
PS我从VxWorks开发shell运行sed,因此它没有Linux版本的所有命令.
您可以消除其中一个循环,因此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脚本的例子和解释.)
不要被混淆(双关语).
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)