用图案打印连续的线条

时间:2018-03-28 03:14:02

标签: text awk sed printing

我正在尝试提取以#开头的第一组行。 我只是想动态地获得第一个模式

例如: 输入

# script:

something 

## Select the operation **  -
# mkfolders)    create      -
# copy)     copy Overlay  -
# bkp)      BKP of overlay  -

something

# commentary
# commentary
something

输出

## Select the operation **
# mkfolders)    create          -
# copy)         copy Overlay    -
# bkp)          BKP of overlay  -

我正在使用以下sed命令

sed -n 5,8p文件

问题在于,如果文件中有任何更改,则需要更改命令。我们欢迎只为第一组节能线提供动态解决方案:

任何解决方案?

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用awk的段落模式

$ awk -v RS= '/^#/{print; exit}' ip.txt
# script:

$ awk -v RS= '/^##/{print; exit}' ip.txt
## Select the operation **  -
# mkfolders)    create      -
# copy)     copy Overlay  -
# bkp)      BKP of overlay  -
  • -v RS=当RS设置为空字符串时,一个或多个连续的空行用作输入记录分隔符
  • /^##/##开头的输入记录
    • print; exit打印输入记录,然后退出,因为只需要第一个这样的记录


问题有点不清楚,下面的代码会打印第一条记录,其中连续两行有#个字符

$ awk -v RS= '/#[^\n]+\n#/{print; exit}' ip.txt
## Select the operation **  -
# mkfolders)    create      -
# copy)     copy Overlay  -
# bkp)      BKP of overlay  -

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -rn '/^\s*#/!b;:a;N;/^\s[^#]/M!ba;/^(\s*#.*\n#[^\n]*).*/!b;s//\1/p;q' file

忘记不以#开头的行。在模式空间中收集后续行,直到不以#或文件结束条件开头的行。如果集合少于两行,请忘记并重复。否则,如果它不以#开头,则删除最后一行,打印该集合并退出。