0

この次の行のように、特定の形式で行が作成されたこのテキスト ファイルがあります。

bla bla name1=WORD1 bla    bla name2=WORD2 bla bla name3=WORD2

すべてのbla blaなしでWORD1 WORD2 WORD3を抽出し、セミコロンで印刷したい

WORD1;WORD2;WORD3

これは sed のみを使用して実行できますか?

4

3 に答える 3

2

別の文字列を処理する 1 つの方法key=value

infileコンテンツで仮定:

bla bla name1=WORD1 bla   noname=WORD4 bla name2=WORD2 bla bla name3=WORD3

そしてscript.sedコンテンツ付き:

## Add a newline character just before each word.
s/name[1-3]=\([^ ]*\)/\n\1/g;

## Remove all characters until each newline appended in previous command, so only
## words will be left, and insert a ';' between them.
s/[^\n]*\n\([^ ]*\)/\1;/g;

## Remove last ';'.
s/;[ ]*$//;

次のように実行します。

sed -f script.sed infile

これにより、次の結果が得られます。

WORD1;WORD2;WORD3
于 2012-08-31T11:13:12.247 に答える
1

awkに興味がある場合は、以下が機能します。

awk '{for(i=1;i<=NF;i++){if($i~/\=/){split($i,a,"=");if(p){p=p";"a[2]}else{p=a[2]}}}}END{print p}'

以下でテスト:

> echo "bla bla name1=WORD1 bla    bla name2=WORD2 bla bla name3=WORD2" | awk '{for(i=1;i<=NF;i++){if($i~/\=/){split($i,a,"=");if(p){p=p";"a[2]}else{p=a[2]}}}}END{print p}'
WORD1;WORD2;WORD2
> 
于 2012-08-31T10:15:22.237 に答える
1

常にこのように発生する場合WORD*は、これら 2 つのパターン[^=]*=を使用[^ ]*して、前と単語をそれぞれ一致させることができます。^グループの先頭で一致を反転します。このようなものはGNU sedで機能します:

sed -r 's/[^=]*=([^ ]*)[^=]*=([^ ]*)[^=]*=(.*)/\1;\2;\3/' infile
于 2012-08-31T10:14:45.887 に答える