如何选择 30 个文件并对它们执行一堆 sed 命令

如何选择 30 个文件并对它们执行一堆 sed 命令

我想要文件的新副本,所以我想做类似的事情:

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

  1. 确保您有一些临时目录来写入输出,否则您无法*.rb在没有获取blob_processed_processed.rb文件的情况下运行该命令两次。当一切完成并正常工作后,您始终可以从临时目录复制输出文件。

  2. 输入文件名""以确保您至少可以处理带空格的文件名。

  3. 在 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

相关内容