如何使用 sed 命令从文件中删除 n 行?

如何使用 sed 命令从文件中删除 n 行?

我想在给定的模式匹配后删除特定数量的行。

谁能告诉我如何使用该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

相关内容