![如何选择 30 个文件并对它们执行一堆 sed 命令](https://linux22.com/image/31911/%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9%2030%20%E4%B8%AA%E6%96%87%E4%BB%B6%E5%B9%B6%E5%AF%B9%E5%AE%83%E4%BB%AC%E6%89%A7%E8%A1%8C%E4%B8%80%E5%A0%86%20sed%20%E5%91%BD%E4%BB%A4.png)
我想要文件的新副本,所以我想做类似的事情:
dir *.rb
foreach file
make a copy of the file, e.g. 'blob.rb' to 'blob_processed.rb'
do the 50 sed commands to process the blob_processed.rb file
end
我怎样才能做到这一点而不创建 30 个执行这些步骤的文件(副本,然后是所有 sed)。 sed 有点长,但它们可以工作,并且每个文件都完全相同。一个例子:
sed -i "s#require "selenium-webdriver"#require 'my_helper' #" blob_processed.rb
答案1
确保您有一些临时目录来写入输出,否则您无法
*.rb
在没有获取blob_processed_processed.rb
文件的情况下运行该命令两次。当一切完成并正常工作后,您始终可以从临时目录复制输出文件。输入文件名
""
以确保您至少可以处理带空格的文件名。在 sed 命令中使用反斜杠 (
\"
)转义双引号
结果会是这样的:
#!/bin/bash
mkdir -p tmp
for i in *.rb
do
out=tmp/${i%.rb}_processed.rb
cp "$i" "$out"
sed -i "s#require \"selenium-webdriver\"#require 'my_helper' #" "$out"
done
[迈克尔编辑(OP)]尽管我这样做了,但这大部分都有效:
#!/bin/bash
mkdir -p tmp
for i in *.rb
do
out=tmp/${i}
cp "$i" "$out"
done
保留相同的文件名,但将所有新文件放在 tmp/ 下
答案2
你可以像这样做得很好:
for i in *.rb
do
cp -- "$i" "processed_$i"
sed -i 's#require "selenium-webdriver"#require '\''my_helper'\'' #' "processed_$i"
done
另外,如果您不介意它是名称更改的原始文件,您可以在修改文件之前使用 seds 功能来备份文件:
sed --in-place=.orig 's#require "selenium-webdriver"#require '\''my_helper'\'' #' *.rb
答案3
我会将 sed 命令放入一个文件中并将其传递给sed
.由于某种原因,我无法使用该-i
选项来实现该功能,但这应该不是问题,因为无论如何您都在复制。例如:
$ cat seds
s/require "selenium-webdriver"/require 'my_helper' /
s/foo/bar/
s/baz/bar/
s/hello/goodbye/
然后,
for i in *.rb
do
sed -f seds "$i" > "processed_$i"
done