最初のエントリだけをsedに置き換える方法は?

最初のエントリだけをsedに置き換える方法は?

オリジナルファイル

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です。sedsed

使用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の印刷ラインの秘密の略語です。

おすすめ記事