我正在尝试提取以#开头的第一组行。 我只是想动态地获得第一个模式
例如: 输入
# 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文件
问题在于,如果文件中有任何更改,则需要更改命令。我们欢迎只为第一组节能线提供动态解决方案:
任何解决方案?
提前致谢。
答案 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
忘记不以#
开头的行。在模式空间中收集后续行,直到不以#
或文件结束条件开头的行。如果集合少于两行,请忘记并重复。否则,如果它不以#
开头,则删除最后一行,打印该集合并退出。