回答:
sed 's/123/AAA/p' a.txt
この式には2つのコマンドが含まれます
s/123/AAA/意味を持つ行を検索123し、交換する123とAAA、それが発生し、それらのライン上の最初のインスタンスで。デフォルトでは、sedすべての行を印刷するため、ストリーム全体が変更されて印刷されます
pつまり、パターンスペースを印刷します。を呼び出した時点でp、パターンスペースには変更された行が含まれているため、再び印刷されます。
sand の組み合わせは、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質問で予想される出力が正確に得られることに注意してください。