如何根据模式匹配使用剪切线?

时间:2017-06-14 10:57:44

标签: awk sed

我的文件输出如下

--B32934--
descr:     X
descr:     Y
descr:     Z
--B20484
descr:     A
descr:     B
descr:     C
--B41946
descr:     1
descr:     2
descr:     3
descr:     4

我只需要--BXXXX编号和第一行,其余的行需要从文件中删除。是否可以根据模式匹配-B删除行> 1?

例如在" - B32934"我只想要" descr:X"。其余的行需要删除。

期望的结果应该如下所示

--B32934--
descr:     X

4 个答案:

答案 0 :(得分:2)

两种方法:

- awk 方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r' file
  • /^--B[0-9]+/ - 如果该行以模式开头

  • r=NR - 保留记录编号

  • (NR-1)==r - 如果它是模式行之后的下一行

要在模式行后捕获以下2行 - 请使用此方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r || (NR-2)==r' file

- GNU sed 方法:

sed -n '/--B[0-9]*/{N;p;}' file
  • N - 在模式空间中添加换行符,然后将下一行输入追加到模式空间(GNU扩展名)

输出(两种方法):

--B32934--
descr: X
--B20484
descr: A
--B41946
descr: 1

答案 1 :(得分:2)

您可以使用以下awk命令:

awk 'p{print;p=0}/^-/{print;p=1}' file

说明:

如果变量p为真,则打印当前行,将p设置回0(false)。如果该行以-开头,则打印当前行并将p设置为1(true)(以便打印下一行)。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '/^--B\S\+/!d;n' file

删除任何不以--B开头,后跟一个或多个非空格字符的行。否则打印该行和以下内容。

答案 3 :(得分:0)

这是grep

的另一个解决方案

grep -e '^--B[0-9]\+' --no-group-separator -A 1 file

输出:

--B32934--
descr:     X
--B20484
descr:     A
--B41946
descr:     1