2017-04-03 13 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的:

$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 

命令我用來運行test.sed:

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 

我已經創建test.sed將搶用3種圖案的任何線和顯示它們。

我想要做的就是反轉輸出,就像它在上面預期的輸出中顯示的那樣,包含當前test.sed無法抓取的行。

我該怎麼做?我試過在test.sed中的所有3個命令的末尾放置/!p而不是/p,但由於多次重複,它無法正常工作。

+3

將所有'p'改爲'd'並使用'sed -f test.sed'? –

+0

爲什麼'$ abc $ 123 = 1234'從期望的輸出中錯過了? – RomanPerekhrest

+0

@BenjaminW。非常感謝你!工作! – Miku

回答

0

sed -n '/pattern/p' infile 

逆是

sed '/pattern/d' infile 

,或者,如果你/pattern/d命令是在一個單獨的文件,

sed -f sedscr.sed infile 

注意,這正是模擬什麼grep -fgrep -vf如果你的模式是pattern1pattern2然後

$ 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)。