2017-04-03 6 views
0

test.sed:sedで複数のパターンを逆にするには?

/^$\([a-z][a-z][a-z]\)$\([0-9][0-9][0-9]\)=\([0-9][0-9][0-9][0-9]\)/p 
/^\+1$\([a-z][a-z][a-z]\)$\([0-9][0-9][0-9]\)=\([0-9][0-9][0-9][0-9]\)/p 
/^1$\([a-z][a-z][a-z]\)$\([0-9][0-9][0-9]\)=\([0-9][0-9][0-9][0-9]\)/p 

file.txtを:私はtest.sedを実行するために使用

$abc$123=1234 
1$abc$123=1234 
11$abc$123=1234 
+$abc$123=1234 
++$abc$123=1234 
+1$abc$123=1234 
++11$abc$123=1234 

はコマンド:

sed -n -f test.sed file.txt 

出力:

$abc$123=1234 
1$abc$123=1234 
+1$abc$123=1234 

予想される出力:

11$abc$123=1234 
+$abc$123=1234 
++$abc$123=1234 
++11$abc$123=1234 

私は3つのパターンを有する任意の行を取得し、それらを表示しますtest.sedを作成しました。

私がしたいのは、上記の期待出力に表示されているように、現在のtest.sedが取り込めない行を含むように、出力を反転することです。

どうすればいいですか?私は/pの代わりに/!pをtest.sedの3つのコマンドの最後に置こうとしましたが、多くの重複のため正しく動作しませんでした。

+3

すべての 'p'を' d'に変更し、 'sed -f test.sed'を使用しますか? –

+0

'$ abc $ 123 = 1234'が期待される出力から見逃されているのはなぜですか? – RomanPerekhrest

+0

@ベンジャミンW。どうもありがとうございました!それはうまくいった! – Miku

答えて

0

sed -n '/pattern/p' infile 

の逆

sed '/pattern/d' infile 

や、あなたの/pattern/dコマンドは別のファイルにある場合は、

sed -f sedscr.sed infile 

これはまさにgrep -fgrep -vfをエミュレートすることをお知らせですdo:あなたのパターンがの場合3210とpattern2を次に

$ cat sedscr1.sed 
/pattern1/p 
/pattern2/p 
$ sed -n -f sedcsr1.sed infile 

$ cat grep_patterns 
pattern1 
pattern2 
$ grep -f grep_patterns infile 

$ cat sedscr2.sed 
/pattern1/d 
/pattern2/d 
$ sed -f sedscr2.sed infile 

grep -vf grep_patterns infile 

と同じ出力を有する(同じファイルgrep_patterns)と同じです。

関連する問題