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 /等中完成,但我想知道是否有一个简洁的单行程序,我可以从命令行运行.
如果这些行都是唯一的,您可以 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)
尝试一下:
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)
| 归档时间: |
|
| 查看次数: |
14388 次 |
| 最近记录: |