オリジナルファイル
claudio
antonio
claudio
michele
次のような結果を得るために、「claudio」の最初の項目を「claudia」に変更したいと思います。
claudia
antonio
claudio
michele
私は以下を試しました:
sed -e '1,/claudio/s/claudio/claudia/' nomi
上記のコマンドはグローバル置換を実行します(すべての「claudio」エントリを置き換えます)。なぜ?
ベストアンサー1
GNUを使用している場合は、以下をsed
試してください。
sed -e '0,/claudio/ s/claudio/claudia/' nomi
sed
まで終了範囲の正規表現チェックを開始しません。後ろに範囲を開始する行です。
~からman sed
(POSIXマンページ、強調鉱山):
2つのアドレスを持つ編集コマンドは、最初のアドレスと一致する最初のパターンスペースから包含範囲を選択する必要があります。Next パターン空間2番目と一致します。
ただし、このアドレスは標準ではなく、他の実装ではサポートされていないGNU拡張0
です。sed
sed
使用awk
作業範囲はawk
あなたの期待に合致します。
$ awk 'NR==1,/claudio/{sub(/claudio/, "claudia")} 1' nomi
claudia
antonio
claudio
michele
説明する:
NR==1,/claudio/
これは、行1から始めて最初の項目で終わる範囲です
claudio
。sub(/claudio/, "claudia")
この代替コマンドは、範囲内にあるときに実行されます。
1
これはawkの印刷ラインの秘密の略語です。