echo 'aaa bbb aaa' | sed 's/aaa/x/' したら x bbb aaa になった
後ろの aaa が残ってる。置換って全部変わるんちゃうの
【疑問】sed 's/old/new/' で置換したのに2個目が変わらん。g・d・-n・-i の使い方【LPICレベル1】
>>1
s コマンドは、各行で最初に見つかった1か所だけを置き換える
行の中の全部を置き換えるなら、最後に g を付ける。sed 's/aaa/x/g' で x bbb x
>>2
ファイルに使ったら、ファイルの中身も変わるん?
>>3
変わらない。sed は結果を標準出力に出すだけで、元のファイルはそのまま
ファイルを書き換えるなら -i。sed -i.bak 's/8080/9090/' app.conf なら、元のファイルを app.conf.bak に残してから書き換える
>>4
-i だけで .bak を付けんかったら?
>>5
バックアップなしで上書きする。間違った置換をすると戻せないから、最初は -i なしで出力を確かめてから付ける
行を消すのはどうやるん
>>7
d コマンド。前に「どの行か」(アドレス)を書くsed '3d' で3行目を消す。sed '2,4d' で2〜4行目
正規表現でも指定できて、sed '/^#/d' はコメント行、sed '/^$/d' は空行を消す
>>8
2つ同時にやりたいときは?
>>9; で続けるか、-e を2回書くsed '/^#/d; /^$/d' app.conf で、コメントと空行を消して設定だけ見られる
特定の行だけ表示したいときは?
>>11-n と p を組み合わせる。sed -n '2,3p' app.conf で2〜3行目だけ
-n なしで p を使うと、全部の行に加えて指定した行がもう1回出るから、同じ行が2回表示される
>>12sed -n '/port/p' って grep port と同じやん。sed でやる意味ある?
>>13
探すだけなら grep のほうが分かりやすい
sed を選ぶのは、探した行を書き換えたり消したりまで1回でやりたいとき。sed '/^port/s/8080/9090/' なら、port で始まる行だけ置換する
置換で、見つかった文字をそのまま使うことはできる?
>>15& が「見つかった文字列全体」になる。echo 'price 100' | sed 's/[0-9][0-9]*/[&]/' で price [100]
かっこで囲んだ部分は \1、\2 で取り出せる
>>16
かっこの書き方が grep と同じで、基本の正規表現やと \( \) なんよな
>>17
そう。-E を付けると拡張正規表現になって、( ) や {3} をそのまま書けるecho '123-4567-8901' | sed -E 's/([0-9]{3})-([0-9]{4})-([0-9]{4})/\1-****-\3/' で 123-****-8901
>>16[0-9]* で [&] にしたら変なところに付かん?
>>19
付く。* は0回もありやから、行の先頭の「空の文字列」に先にマッチして []price 100 になる
1文字以上にしたいなら、>>16 のように [0-9][0-9]* と書くか、-E で [0-9]+
パスを置換すると / だらけで読めん
>>21
s の区切りは / 以外も使える。sed 's|/usr/local|/opt|' のように、置換に出てこない文字を選ぶ
管理人のひとこと
- sed の s は各行の最初の1か所だけを置き換え、g で行内の全部。結果は標準出力に出るだけで、ファイルを書き換えるのは -i(-i.bak でバックアップを残す)。
- d で行を消す(
3d、2,4d、/^#/d、/^$/d)。-n と p で指定行だけ表示。アドレスと s を組み合わせると、条件に合う行だけ置換できる。 - & は見つかった文字列全体、\1 などはかっこの部分。基本の正規表現では \( \)、-E ならそのまま書ける。[0-9]* は空にもマッチする。区切りは | なども使える。