파일에서 연속적으로 일치하는 줄의 첫 번째 블록을 추출하시겠습니까?

파일에서 연속적으로 일치하는 줄의 첫 번째 블록을 추출하시겠습니까?

그래서 다음과 같은 파일이 있습니다.

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

^(#.*)|(\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*)$정규 표현식이 일치하길 원합니다

  • #줄 시작 부분에 주석이 있는 경우
  • 빈 줄(예: 다음 줄 # Author)
  • 줄에는 공백만 포함됩니다.

답변1

그리고 awk:

$ awk '/^#/{f=1} f && !/^#|^[[:space:]]*$/{exit} f' ip.txt
#!/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

첫 번째 주석이 발견되면 줄 추출이 시작되고 줄이 주석이거나 공백이 0개 이상인 한 계속 인쇄됩니다.

답변2

GNU sed. 후행 공백 없음:

sed '/^#/,$!d;:1;/^\s*$/N;/\S/!b1;/^#/M!Q' file

/^#/,$!d- 주석이 시작되기 전에 줄을 자릅니다.
:1;/^\s*$/N;/\S/!b1- 빈 줄이 있거나 공백만 있는 경우 버퍼(패턴 공간)에 추가합니다.
/^#/M!Q'- 주석 태그로 시작하지 않는 줄이 발견되면 스크립트를 종료합니다( M- 앵커는 여러 줄 버퍼에서 작동합니다).

뒤에 공백이 있는 경우:

sed '/^#/,$!d;/^#\|^\s*$/!Q' file

관련 정보