我的文件输出如下
--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
答案 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