설명하다

설명하다

파일 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 
]

설명하다

  1. nl -bp특정 패턴에 따라 줄 번호를 추가할 수 있습니다.
  2. 여기서는 탭 nl -s ' '대신 공백을 구분 기호로 사용합니다 .\tsed
nl -bp'\[' -s ' ' input.txt
       first
     1 [
       third
       fourth
       ]
       sixth
     2 [
       eighth 
       ]
       tenth
  1. 기본적으로 nl패딩을 위해 앞에 6자가 추가되며, 처음 7자를 제거할 수 있습니다 cut -c 8-.

관련 정보