2

私はシェルスクリプトに不慣れで、問題を解決しようとしています。

基本的にREGEX、テキストファイルでパターンのインスタンスを見つけsed、各結果を編集してから、他の元のテキストを邪魔することなく、結果を元のテキストファイルに出力する必要があります。

私が直面しているメンタルブロックは、a)最終的な変換結果を達成するために複数のパターン置換を行う必要があるため、sedへの単一の呼び出しに適合できないことです。b)結果をgrepした場合パターンを使用すると、REGEXそのパターンに一致する結果のみが表示されます。わかりました。先に進み、それらを編集して最終的な目的の出力に変換しますが、この変更をテキストファイルの元の場所に正確に書き込みたいと思います。元のファイルを参照せず、結果セットのみを参照pipe grepするため、参照できません。sed -i私はこれについて間違った方法で考えていますか、それとも私が気付いていないコマンドがありますか?

4

2 に答える 2

7

sedのアドレス指定機能を使用してコマンドを適用する前に、「grep」を実行できます。

sed '/grep-like regex/ s/pattern to replace/replacement/' -i file

「-iファイル」がsedに「ファイル」を所定の場所で編集するように指示する場合。

複数のコマンドには、セミコロンまたは複数の「-e」オプションを使用したコマンドラインで区切って指定できます。

sed -e '/regex1/ s/pattern1/replacement/' -e '/regex2/ s/pattern2/replacement/'
sed '/regex1/ s/pattern1/replacement/; /regex2/ s/pattern2/replacement/'

上記の例でregex1とregex2が同じである場合、backetsを使用して、置換コマンドを1つのブロックにグループ化することもできます。

sed '/regex/ { s/pattern1/replacement/; s/pattern2/replacement/ }'

または明確にするために:

sed '/regex/ {
        s/pattern1/replacement/
        s/pattern2/replacement/
    }'

/ regexes /をネストすることにより、行をさらにフィルタリングしてコマンドを適用することもできます。

sed '/regex1/ {
        s/pattern1/replacement/
        /regex2/ s/pattern2/replacement/
    }'

したがって、2番目の置換コマンドは、regex1とregex2が一致する場合にのみ実行されます。

于 2012-09-27T19:32:06.960 に答える
5

sed複数の置換を問題なく処理できます。sed 's/p1/r1/g; s/p2/r2/g'

ただし、ファイルを編集する場合は、ストリームエディタを使用しないでください。 sedのストリーミングバージョンですed。ファイルを編集する場合は、を使用してedください。

echo ',s/pattern/repl/g;,s/pattern2/repl2/g;w' | tr \; \\012 | ed -s file

あなたのコメントを踏まえて、特定のパターンに一致する行のみを検索して置換したいと思います。たとえば、「qux」を含むすべての行で「foo」を「bar」に置き換えるには、次のようにします。

echo '/qux/s/foo/bar;w' | tr \; \\012 | ed -s file

を使用することについて、私は多少面倒であることに注意してくださいed。sedでもまったく同じことができます。

sed '/qux/s/foo/bar' file

しかし、それsed -iは悲劇です(ハードリンクを壊します)。

于 2012-09-27T19:05:48.337 に答える