所以我有一个这样的文件:
echo 'this line is added for demo purpose'
echo 'do not extract this line and the line above'
#!/usr/bin/env bash
# header: add, replace, and delete header lines.
#
# Example usage:
# $ seq 10 | header -a 'values'
# $ seq 10 | header -a 'VALUES' | header -e 'tr "[:upper:]" "[:lower:]"'
# $ seq 10 | header -a 'values' | header -d
# $ seq 10 | header -a 'multi\nline' | header -n 2 -e "paste -sd_"
#
# See also: body
#
# Author: http://jeroenjanssens.com
usage () {
cat << EOF
header: add, replace, and delete header lines.
usage: header OPTIONS
OPTIONS:
...
}
# i don't want
# these comments
# even if
# these lines match
我想提取所有匹配 regex 的行^(#.*)|(\s*)$
,从文件中匹配的第一行,连续到匹配的最后一行。
提取的期望结果应该是
#!/usr/bin/env bash
# header: add, replace, and delete header lines.
#
# Example usage:
# $ seq 10 | header -a 'values'
# $ seq 10 | header -a 'VALUES' | header -e 'tr "[:upper:]" "[:lower:]"'
# $ seq 10 | header -a 'values' | header -d
# $ seq 10 | header -a 'multi\nline' | header -n 2 -e "paste -sd_"
#
# see also: body
#
# Author: http://jeroenjanssens.com
我该怎么做呢?
我想我可以在多行模式下用正则表达式提取所有连续匹配的行,但我只想要匹配的第一部分。
更新:
我想要正则表达式^(#.*)|(\s*)$
匹配
- 行首带有 a
#
的注释 - 空行(如后面的那一行
# Author
) - 行只包含空格
与
awk
:这将在找到第一个注释时开始提取行,并继续打印,只要一行是注释或具有零个或多个空格的行。
GNU sed。没有尾随空格:
/^#/,$!d
- 在评论开始前截断行。:1;/^\s*$/N;/\S/!b1
- 如果有空行或只有空格,则添加到缓冲区(模式空间)。/^#/M!Q'
- 如果遇到不以注释标记开头的行,则退出脚本(M
- 锚在多行缓冲区中有效)。带有尾随空格: