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回実行できません。すべてが完了し、正常に機能したら、いつでも一時ディレクトリから出力ファイルをコピーできます。

  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

[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

関連情報