grep使用上下文反转搜索

aar*_*acy 20 unix shell grep sed

我想过滤掉文件中匹配行之前和之后的几行.

这将删除我不想要的行:

$ grep -v "line that i don't want"
Run Code Online (Sandbox Code Playgroud)

这将在我不想要的行之前和之后打印2行:

$ grep -C 2 "line that i don't want"
Run Code Online (Sandbox Code Playgroud)

但是当我将它们组合起来时,它不会过滤掉我不想要的行之前和之后的2行:

# does not remove 2 lines before and after the line I don't want:
$ grep -v -C 2 "line that i don't want"   
Run Code Online (Sandbox Code Playgroud)

如何不仅过滤掉我不想要的线,还要过滤掉之前和之后的线?我猜sed这会更好......

编辑:我知道这可以在几行awk/Perl/Python/Ruby /等中完成,但我想知道是否有一个简洁的单行程序,我可以从命令行运行.

Eme*_*ski 5

如果这些行都是唯一的,您可以 grep 要删除到文件中的行,然后使用该文件从原始文件中删除行,例如

grep -C 2 "line I don't want" < A.txt > B.txt
grep -f B.txt A.txt
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 4

尝试一下:

sed 'h;:b;$b;N;N;/PATTERN/{N;d};$b;P;D' inputfile
Run Code Online (Sandbox Code Playgroud)

您可以改变模式之前的命令数N以影响要删除的行数。

您可以以编程方式构建一个包含命令数量的字符串N

C=2 # corresponds to grep -C
N=N
for ((i = 0; i < C - 1; i++)); do N=$N";N"; done
sed "h;:b;\$b;$N;/PATTERN/{N;d};\$b;P;D" inputfile
Run Code Online (Sandbox Code Playgroud)

  • 即使在手册页的帮助下,我也很难理解单行 sed 按命令执行的操作。我可能会稍后审查,但如果不是太麻烦,你介意把它分解吗?我认为这将有利于答案的质量。 (4认同)
  • 不,你的意思是 `grep` 不能做到这一点?!有理由吗?这对我来说是违反直觉的 (2认同)