読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】sed 's/old/new/' で置換したのに2個目が変わらん。g・d・-n・-i の使い方【LPICレベル1】

22レスカテゴリ:Linux
1: 名無しさん

echo 'aaa bbb aaa' | sed 's/aaa/x/' したら x bbb aaa になった
後ろの aaa が残ってる。置換って全部変わるんちゃうの

2: 名無しさん

>>1
s コマンドは、各行で最初に見つかった1か所だけを置き換える
行の中の全部を置き換えるなら、最後に g を付ける。sed 's/aaa/x/g' で x bbb x

3: 名無しさん

>>2
ファイルに使ったら、ファイルの中身も変わるん?

4: 名無しさん

>>3
変わらない。sed は結果を標準出力に出すだけで、元のファイルはそのまま
ファイルを書き換えるなら -i。sed -i.bak 's/8080/9090/' app.conf なら、元のファイルを app.conf.bak に残してから書き換える

5: 名無しさん

>>4
-i だけで .bak を付けんかったら?

6: 名無しさん

>>5
バックアップなしで上書きする。間違った置換をすると戻せないから、最初は -i なしで出力を確かめてから付ける

7: 名無しさん

行を消すのはどうやるん

8: 名無しさん

>>7
d コマンド。前に「どの行か」(アドレス)を書く
sed '3d' で3行目を消す。sed '2,4d' で2〜4行目
正規表現でも指定できて、sed '/^#/d' はコメント行、sed '/^$/d' は空行を消す

9: 名無しさん

>>8
2つ同時にやりたいときは?

10: 名無しさん

>>9
; で続けるか、-e を2回書く
sed '/^#/d; /^$/d' app.conf で、コメントと空行を消して設定だけ見られる

11: 名無しさん

特定の行だけ表示したいときは?

12: 名無しさん

>>11
-n と p を組み合わせる。sed -n '2,3p' app.conf で2〜3行目だけ
-n なしで p を使うと、全部の行に加えて指定した行がもう1回出るから、同じ行が2回表示される

13: 名無しさん

>>12
sed -n '/port/p' って grep port と同じやん。sed でやる意味ある?

14: 名無しさん

>>13
探すだけなら grep のほうが分かりやすい
sed を選ぶのは、探した行を書き換えたり消したりまで1回でやりたいとき。sed '/^port/s/8080/9090/' なら、port で始まる行だけ置換する

15: 名無しさん

置換で、見つかった文字をそのまま使うことはできる?

16: 名無しさん

>>15
& が「見つかった文字列全体」になる。echo 'price 100' | sed 's/[0-9][0-9]*/[&]/' で price [100]
かっこで囲んだ部分は \1、\2 で取り出せる

17: 名無しさん

>>16
かっこの書き方が grep と同じで、基本の正規表現やと \( \) なんよな

18: 名無しさん

>>17
そう。-E を付けると拡張正規表現になって、( ) や {3} をそのまま書ける
echo '123-4567-8901' | sed -E 's/([0-9]{3})-([0-9]{4})-([0-9]{4})/\1-****-\3/' で 123-****-8901

19: 名無しさん

>>16
[0-9]* で [&] にしたら変なところに付かん?

20: 名無しさん

>>19
付く。* は0回もありやから、行の先頭の「空の文字列」に先にマッチして []price 100 になる
1文字以上にしたいなら、>>16 のように [0-9][0-9]* と書くか、-E で [0-9]+

21: 名無しさん

パスを置換すると / だらけで読めん

22: 名無しさん

>>21
s の区切りは / 以外も使える。sed 's|/usr/local|/opt|' のように、置換に出てこない文字を選ぶ

管理人のひとこと