我正在尝试提取以#开头的第一组行。我只是想动态地获得第一个模式
示例:输入
# 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文件
问题是,如果文件有任何更改,则需要更改命令。欢迎仅针对第一组私密线的动态解决方案:
任何解决方案?
预先感谢。
使用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 -
这可能对您有用(gnu sed(:
sed -rn '/^s*#/!b;:a;N;/^s[^#]/M!ba;/^(s*#.*n#[^n]*).*/!b;s//1/p;q' file
忘记不以#
开头的线。在模式空间中收集后续行,直到不以#
或文件结束条件开头的线为止。如果该系列小于两行,请忘记它们并重复。否则,请删除最后一行,如果不以#
开头,请打印收集并退出。