回答:
sed 's/123/AAA/p' a.txt
この式には2つのコマンドが含まれます
s/123/AAA/
意味を持つ行を検索123
し、交換する123
とAAA
、それが発生し、それらのライン上の最初のインスタンスで。デフォルトでは、sed
すべての行を印刷するため、ストリーム全体が変更されて印刷されます
p
つまり、パターンスペースを印刷します。を呼び出した時点でp
、パターンスペースには変更された行が含まれているため、再び印刷されます。
s
and の組み合わせは、p
通常、で使用-n
されs
、そのために変更されたストリームの行のみを印刷する場合に使用されます。
コマンドの順序が重要です。コマンドで、p
最初に配置すると、変更されていないストリームが、期待どおりに出力されます。
$ sed 'p;s/123/AAA/' a.txt
apple
apple
123
AAA
pear
pear
1234
AAA4
ここでを呼び出すp
とき、パターンスペースはファイル全体です。これは、その一部を指定しておらず、変更されていないためです。また、このs
コマンドはファイル全体を出力しますが、ファイルを変更するため、変更されたストリームと変更されていないストリームが2回表示されます。1
したがって、おそらくsed
式のコマンドは左から右に累積的に適用されると考えるのに役立ちます.steeldriverが言ったように、この場合に得られる出力p
は、s
選択に使用された後、サイクルの終わりに適用されるためですファイルの一部を変更します。
1元々、私が持っていたコマンドはでしたsed 'ps/123/AAA/' a.txt
。同様に親切に指摘mxmlnknによるコメントは、このコマンドはGNUでは動作しませんsed
。私はBusyBoxをsed
(AndroidのTermuxで)使用していましたがsed
、UbuntuのGNU でコマンドを適切にテストしませんでした(悪い!)。しかしsed
、ここでセミコロンを必要とする点でGNU が他のGNU と異なることを知ることは興味深いです。
sed 'ps/123/AAA/' a.txt
私にはうまくいきません。与えるsed: -e expression #1, char 2: extra characters after command
。sed -n 'p; s/123/AAA/p' a.txt
質問で予想される出力が正確に得られることに注意してください。