如何在sed中反转多个模式?

时间:2017-04-03 20:20:37

标签: sed

test.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,但由于许多重复,它无法正常工作。

1 个答案:

答案 0 :(得分: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)。