Sumary
GNU構文:
sed '/claudio/{s//claudia/;:p;n;bp}' file
または(置換する単語を1回だけ使用するには:
sed '/\(claudi\)o/{s//\1a/;:p;n;bp}' file
または、POSIX構文では:
sed -e '/claudio/{s//claudia/;:p' -e 'n;bp' -e '}' file
任意のsedで動作し、最初の行を見つけるのに必要なだけの行だけを処理します。最初の行にあり、1つの正規表現文字列のみを使用するため短いclaudio
場合でも動作しclaudio
ます。
詳細
1行のみを変更するには、1行のみを選択する必要があります。
1,/claudio/
(質問から)を使用して選択します:
- 最初の行から(無条件)
- 次の文字列を含む行
claudio
。
$ cat file
claudio 1
antonio 2
claudio 3
michele 4
$ sed -n '1,/claudio/{p}' file
claudio 1
antonio 2
claudio 3
を含む行を選択するにはclaudio
、次を使用します。
$ sed -n `/claudio/{p}` file
claudio 1
claudio 3
また、ファイルの最初のもの のみを選択するには、次claudio
を使用します。
sed -n '/claudio/{p;q}' file
claudio 1
次に、その行でのみ置換を行うことができます。
sed '/claudio/{s/claudio/claudia/;q}' file
claudia 1
これは、最初の行で正規表現に一致するものが複数ある場合でも、その行で最初に一致する正規表現のみを変更します。
もちろん、/claudio/
正規表現は次のように簡略化できます。
$ sed '/claudio/{s//claudia/;q}' file
claudia 1
そして、欠けている唯一のものは、変更されていない他のすべての行を印刷することです。
sed '/claudio/{s//claudia/;:p;n;bp}' file
info sed
:(0,/REGEXP/
:0の行番号は次のようにアドレス指定に使用することができる0,/REGEXP/
ようになるsed
。あまりにも最初の入力ラインにREGEXPに一致するようにしようとしますつまり、0,/REGEXP/
あります同様1,/REGEXP/
ADDR2は、入力の最初の行に一致する場合1 / REGEXP /フォームは、その範囲の開始と一致し、従って、レンジスパンを作るのに対し0、/ REGEXP /フォームは、それが範囲を終了するために検討することを除いて、正規表現の2回目の出現まで)