파일 a에서 대괄호 줄을 인쇄할 수 있습니다.
first
[
third
fourth
]
sixth
[
eighth
]
tenth
함으로써
% <a sed -n '/\[/,/\]/p'
인쇄
[
third
fourth
]
[
eighth
]
하지만 두 번째 게임만 원한다면 어떻게 되나요? 마지막 세줄요?
답변1
awk
에 의해 정의된 블록이 자체적으로 블록을 포함하지 않거나 블록 내에 있다고 가정하면 사용하기가 더 쉽습니다.[
]
[
]
$ awk -v b=2 '/\[/{c++} c==b; /]/ && c==b{exit}' ip.txt
[
eighth
]
-v b=2
어떤 블록이 필요한지 지정하는 변수/\[/{c++}
행이 시작 조건과 일치하면 카운터 증가c==b;
카운터가 필요한 블록과 같으면 입력 레코드를 인쇄합니다./]/ && c==b{exit}
종료조건이 일치하면 종료
그것을 작성하는 또 다른 방법:
awk -v b=2 '/\[/{c++} c==b{print $0; if(/]/) exit}' ip.txt
답변2
$ sed -n '/^\[/h; /^\[/,/^\]/H; ${x;s/^\[\n//;p;}' file
[
eighth
]
주석이 달린 sed
스크립트(가설 -n
):
/^\[/h; # replace hold space with this line
/^\[/,/^\]/H; # append these lines to hold space with embedded newlines
${ # at last line of input
x; # swap in the hold space
s/^\[\n//; # delete the first "[" and the newline following it
p; # print
}
즉, 로 시작하는 줄을 찾을 때마다 [
해당 줄을 복사하여 예약된 공간을 지웁니다. 그런 다음 로 시작하는 해당 줄을 찾을 때까지 예약된 공간에 줄을 계속 추가합니다 ]
.
마지막으로 [
예약된 공간이 너무 많아 데이터를 인쇄하기 전에 해당 공간(및 그 뒤에 포함된 개행 문자)을 제거합니다.
답변3
sed
편집기를 사용하여 다음을 수행할 수 있습니다.
sed -ne ' ;# "-n" suppresses autoprint of pattern space
/^\[/!d ;# skip lines that donot begin a fresh block
:a;$!N;/\n]/!ba ;# keep appending lines to pattern space until end of block
G ;# append our makeshift counter (hold space) to pattern spc
s/\n\{2\}$//p ;# only when counter had 2 chars in it, we print block
/\n$/!q ;# target block, 2nd block has been printed so quit
x;s/$/\n/;x ;# target block not reached, so increment
' input.file
의 경우 부울 값 $k == 2와 함께 이 연산자를 사용 Perl
하여 ...
예상 대상 블록에 도달했으며 이를 인쇄해야 함을 나타낼 수 있습니다.
perl -lne 'print if /^\[/ && ++$k == 2 ... /^]/' input.file
답변4
nl -bp'\[' -s ' ' input.txt | sed -n '/ *2 \[/,/\]/p' | cut -c 8-
입력.txt:
first
[
third
fourth
]
sixth
[
eighth
]
tenth
표준 출력:
[
eighth
]
설명하다
nl -bp
특정 패턴에 따라 줄 번호를 추가할 수 있습니다.- 여기서는 탭
nl -s ' '
대신 공백을 구분 기호로 사용합니다 .\t
sed
nl -bp'\[' -s ' ' input.txt
first
1 [
third
fourth
]
sixth
2 [
eighth
]
tenth
- 기본적으로
nl
패딩을 위해 앞에 6자가 추가되며, 처음 7자를 제거할 수 있습니다cut -c 8-
.