我想在给定的模式匹配后删除特定数量的行。
谁能告诉我如何使用该sed
命令来完成此操作?
答案1
sed -ne '/pattern/{n;n;n;n;d;}' -e p
将删除匹配的行图案之后是 4 行。
如果您不想删除与模式本身匹配的行:
sed -ne '/pattern/{p;n;n;n;n;d;}' -e p
说明:如果当前行与图案,[p]打印它,然后获取[n]ext,然后[n]ext和[n]ext,然后[n]ext和[d]丢弃它。由于 [d]iscard,在这种情况下不会运行 [p]rint 命令。它每隔一行运行一次。-n
禁用自动打印(这将打印几乎所有内容),因此意味着使用-e p
,这确保打印结果行。
例子:
$ seq 8 | sed -ne '/2/{p;n;n;n;n;d;}' -e p
1
2
7
8
为了能够将行数指定为数字,使用以下命令会更容易awk
:
awk 'n>0 {n--;next}; /pattern/{n=4}; 1'
(请注意,在所有这些解决方案中,不会在跳过的行中查找模式)。
答案2
两步,假设是 bash。假设要删除 2 行后包含“模式”的行。注意:包含模式的行不会被删除,但其后的 2 行将被删除。
要删除N
行,请更改grep 参数中的A2
->AN
grep -n -A2 pattern inputFile | grep -Ev pattern | sed 's/^\([0-9]*\)-.*/\1/g' > linesToRemove
while read p; do sed -i "${p}d" inputFile; done < linesToRemove
如果您还想删除包含模式的行,请将 grep 命令更改为
grep -n -A2 pattern inputFile | sed 's/^\([0-9]*\)[-:].*/\1/g' > linesToRemove
解释:第一个命令找出要删除的行的行号。第二个命令依次删除这些行。使用http://explainshell.com/了解更多或只是man grep
如果你的 sed 没有-i
选项,请阅读https://stackoverflow.com/a/15400287/1729501