sedやperlの置換構文〜substitute(s///)

4-3.文字列置換

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倍にしました。

コメント

タイトルとURLをコピーしました