ファイルの新しいコピーが必要なので、次のようなことをしたいと思います。
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
コマンドを2回実行できません。すべてが完了し、正常に機能したら、いつでも一時ディレクトリから出力ファイルをコピーできます。""
少なくともスペースを含むファイル名を処理できるように、ファイル名を入力してください。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
[Edited by Michael (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