21

ファイル内のいくつかの行を編集して、行が (av または avpgw) で始まる場合は新しいテキストに置き換え、それ以外の場合は最初に新しいテキストを挿入する必要があります。

sed を使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

17

次の方法で実行できます。

sed -e 's/^avpgw/new text/' -e t -e 's/^av/new text/' -e t -e 's/^/new text/' file

これにより、パターンが (s///) に置き換えnew textられ、末尾 (t) にジャンプします。それ以外の場合は、次のパターンを試みます。sed コマンドの概要も参照してください。

;コマンドを次のように区切ることもできます。

sed 's/^avpgw/new text/; t; s/^av/new text/; t; s/^/new text/' file

または、コマンドを sed コマンド ファイルに入れます。

s/^avpgw/new text/
t
s/^av/new text/
t
s/^/new text/

次のように呼び出します。

sed -f commandfile file

大文字と小文字を区別しない場合は、 のように、代替コマンドの最後に i を追加しますs/^av/new text/i。もう 1 つの方法は、文字セットを使って説明することs/^[aA][vV]/new text/です。しかし、それはsed特定のものではありません。このため、一般的に正規表現を検索できます。

于 2012-10-22T15:02:45.897 に答える
1

これはうまくいくかもしれません(GNU sed):

sed -r 's/^av(pgw)?.*/replacement/;t;s/^/replacement /' file
于 2012-10-22T15:10:24.153 に答える
0

私の答えは、上記のOlafの優れた解決策に対するちょっとした説明です。

OSX を使用していて (私の場合、Catalina を使用して 2005 の非 GNU バージョンsedを使用しています)、彼のより簡潔なセミコロン ベースのソリューションを使用しようとしている場合 (以下で繰り返します。終わり):

sed 's/^avpgw/new text 1/; t; s/^av/new text 2/; t; s/^/new text 3/' file

...コマンドをセミコロン[ ]tと組み合わせて使用​​すると、以下のようなエラーが発生する場合があります(セミコロンは通常のスペースでコマンドの残りの部分と区切られています)。;

sed: 1: "s/^avpgw/new text 1/; t ...": undefined label '; s/^av/new text 2/; t; s/^/new text 3/'

この問題と解決策は、MacOS の sed “undefined label” で説明されています。

以下は、OSX で動作する Olaf の「オールインワン コマンド」ソリューションのバージョンです。\n余分な s を使用するよりも、キャラクターが本当に優れているかどうかは議論の余地があり-eます。lolz はさておき:私が主に投稿しているのは、この問題の「根本的な原因」を共有して、OS X を使用している人々が、自分のバージョンがコマンドsedを適切にサポートしていないと思い込んで頭がおかしくなるのを防ぐためです。tセミコロンと改行の問題、それだけです!

テスト ファイル:

bash-3.2$ cat file
+ cat file
something
avpgw something else
av another thing
text

OS X で実行される元のコマンド:

bash-3.2$ sed 's/^avpgw/new text 1/; t; s/^av/new text 2/; t; s/^/new text 3/' file

sed: 1: "s/^avpgw/new text 1/; t ...": undefined label '; s/^av/new text 2/; t; s/^/new text 3/'

セミコロンの代わりに改行を使用:

bash-3.2$ sed $'s/^avpgw/new text 1/\nt\ns/^av/new text 2/\nt\ns/^/new text 3/' file

new text 3something
new text 1 something else
new text 2 another thing
new text 3text
于 2021-04-18T20:18:25.210 に答える