sedやperlが備えているs///構文は、とても強力です。
s/置換前/置換後/オプション
先頭のsはsubstituteの略で置換するという意味です。s一文字で短すぎる気もしますが、慣れると見やすく入力しやすいです。
置換前置換後の文字列には当然正規表現が使えます。/で区切って置換前文字列、置換後文字列、オプションを指定します。
まずは実験用に以下のファイルを用意しておきます。
takk~$ cat hello.txt ELL ELL ELL ELL ELL ELL ell ell ell ell ell ell takk~$
これらの文字列ELLをHELLOに置換する方法は、sed、perlではそれぞれ以下のようになります。
sedの場合
takk~$ sed s/ELL/HELLO/ hello.txt HELLO ELL ELL HELLO ELL ELL ell ell ell ell ell ell takk~$
perlの場合
takk~$ perl -pe s/ELL/HELLO/ hello.txt HELLO ELL ELL HELLO ELL ELL ell ell ell ell ell ell takk~$
sedもperlもs///にオプションを指定しないと、各行の最初にマッチした文字列との置換となります。
行全体に対して置換をするには、g(Global)オプションをつけます。
sedの場合
takk~$ sed s/ELL/HELLO/g hello.txt HELLO HELLO HELLO HELLO HELLO HELLO ell ell ell ell ell ell takk~$
perlの場合
takk~$ perl -pe s/ELL/HELLO/g hello.txt HELLO HELLO HELLO HELLO HELLO HELLO ell ell ell ell ell ell takk~$
i(IgnoreCase)オプションを指定すると、大文字小文字の区別がなくなります。
sedの場合
takk~$ sed s/ELL/HELLO/i hello.txt HELLO HELLO HELLO HELLO HELLO HELLO HELLO ell ell HELLO ell ell takk~$
perlの場合
takk~$ perl -pe s/ELL/HELLO/i hello.txt HELLO HELLO HELLO HELLO HELLO HELLO HELLO ell ell HELLO ell ell takk~$
sedの場合は、何番目に発見されたか番号を指定することで、置換する対象を指定できます。
以下は2番目のELLを置換した結果です。
takk~$ sed s/ELL/HELLO/2 hello.txt ELL HELLO ELL ELL HELLO ELL ell ell ell ell ell ell takk~$
最後にperlの真骨頂とも思うeオプションです。
まずは実験用ファイルseq.txtを作成します。
takk~$ seq 50 | pr -tJ5 | tee seq.txt 1 11 21 31 41 2 12 22 32 42 3 13 23 33 43 4 14 24 34 44 5 15 25 35 45 6 16 26 36 46 7 17 27 37 47 8 18 28 38 48 9 19 29 39 49 10 20 30 40 50 takk~$
e(Eval)オプションを指定すると、s///に指定する置換後文字列の代わりに式が使えます。
takk~$ perl -pe 's/(\d+)/$1 * $1/ge' seq.txt 2 22 42 62 82 4 24 44 64 84 6 26 46 66 86 8 28 48 68 88 10 30 50 70 90 12 32 52 72 92 14 34 54 74 94 16 36 56 76 96 18 38 58 78 98 20 40 60 80 100 takk~$
eオプションにgオプションを重ねて指定することで、すべての数を2倍にしました。
コメント