stdout
다음과 같은 텍스트 블록이 많이 있습니다 .
% QUESTION
Who played drums for The Beatles?
% QUESTION
Who played
guitar
for The Beatles?
% QUESTION
Who played
bass for The Beatles
?
여기서의 아이디어는 파일이 "청크"로 나누어져 있고 각 청크가 한 줄로 시작한다는 것입니다 % QUESTION
. 이 데이터의 n번째 청크를 인쇄하는 스크립트를 작성하고 싶습니다.
예를 들어 distribution은 nthchunk 3
인쇄되어야 합니다.
Who played
bass for The Beatles
?
어떻게 해야 하나요?
답변1
awk
정규식을 레코드 구분 기호( )로 지원하는 RS
구현(예: GNU)을 사용하면 awk
다음을 수행할 수 있습니다.
awk -v n=3 -v RS='(\n+|^)% QUESTION\n' 'NR == n+1 {print; exit}' < questions.txt
답변2
GNU sed-E
이 문제를 해결하기 위해 확장된 정규식 패턴을 사용 합니다. 기본 아이디어는 연속적인 % 문제 행과 그 사이의 행을 패턴 공간에 축적하는 것입니다. 카운터는 일련의 점 형태로 저장 공간에 유지됩니다.
chunk=2
sed -E ':loop
/%/,/%/N
/%.*%/!{
/%/!d;$!bloop
s/$/\nfiller/
}
G;s/$/./
/\n[.]{'"${chunk}"'}$/bend
h;s/.*\n//;x
s/.*(\n.*)\n.*$/\1/;D
:end
s/^[^\n]*\n+(\S.*\S)(\n.*){2}$/\1/
q
' file
대안으로, Perl은 slurp 모드에 있고 FS는 문제 라인으로 설정됩니다. @F 배열의 요소는 블록이어야 합니다.
perl \
-F'/(?:^|\n+)\%\h+QUESTION\n+/' \
-pals -0777 \
-e '$_=$F[$n]' \
-- -n="${chunk}" ./file;
산출:
Who played
guitar
for The Beatles?
답변3
이 데이터의 n번째 청크를 인쇄하는 스크립트를 작성하고 싶습니다.
RS
합계를 설정하면 ORS
다음과 같은 각 질문을 얻을 수 있습니다.
이 필요다중 문자 RS용 GNU awk
awk -v RS='% QUESTION' -v ORS='' '/\<drums\>/ {print $0}' file
Who played drums for The Beatles?
- 또는
bass
awk -v RS='% QUESTION' -v ORS='' '/\<bass\>/ {print $0}' file
Who played
bass for The Beatles
?
- 또는
guitar
:
awk -v RS='% QUESTION' -v ORS='' '/\<guitar\>/ {print $0}' file
Who played
guitar
for The Beatles?
- 또는 블록 대신 숫자를 사용하십시오.
$ nchunk=3
awk -v nchunk="$nchunk" -v RS='% QUESTION' -v ORS='' 'NR==nchunk+1 {print $0}' file
Who played
bass for The Beatles
?