체스 게임에서 단락 뒤에 문자열과 pgn이 있는 awk 단락

체스 게임에서 단락 뒤에 문자열과 pgn이 있는 awk 단락

awk를 사용하여 문자열과 다음 단락이 포함된 단락을 얻는 방법은 무엇입니까?

파일은 다음과 같습니다.

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player A"]
[Black "Player B"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player B"]
[Black "Player C"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player C"]
[Black "Player A"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

이 명령은 내가 원하는 단락을 반환합니다.

> awk '/Player A/' RS="\n\n" ORS="\n\n" file.pgn

게임 액션에 다음 단락을 추가하는 방법은 무엇입니까?

이와 같이:

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player A"]
[Black "Player B"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player C"]
[Black "Player A"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

답변1

$ awk -v RS= -v ORS='\n\n' '/"Player A"/{c=2} c&&c--' file
[Event "Chess game"]
[Date "2021.01.08"]
[White "Player A"]
[Black "Player B"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player C"]
[Black "Player A"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

바라보다인쇄를 위해 sed- 또는 awk-a-line-follow-a-matching-pattern을 사용하십시오.이 관용구 및 관련 관용구가 어떻게 작동하는지 자세히 설명합니다.

나는 귀하의 질문을 더 강력하게 테스트하는 데 사용한 정규식을 만들었고 대신 Player A사용하여 멍청이뿐만 아니라 어떤 멍청이에서도 작동하도록 했습니다.RS=<null string>RS='\n\n'

답변2

paragraph모드 에서

awk -v RS= -v ORS="\n\n" '
  /"Player A"/ { var=NR+1;print }
  var==NR
' file

진주모드 paragraph(-00)

perl -00 -ne '
  print s/\z/<>/re
    if /"Player A"/ && !eof;
' file

sed예약된 공간에 비어 있지 않은 줄의 블록을 수집합니다. 대상 단락이 결정되면 거기에서 가장 가까운 빈 줄까지 인쇄를 시작합니다 (=> 다음 레코드 인쇄)

sed -e '
  /./,/^$/!d
  H;/./d;x;s///
  /"Player A"/!d
  :n;n;/^$/!bn
' file

결과:

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player A"]
[Black "Player B"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

[Event "Chess game"]
[Date "2021.01.08"]
[White "Player C"]
[Black "Player A"]
[Result "0-1"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Bc5 5. O-O b5 6. Bb3 Nf6
7. Nxe5 Nxe5 8. d4 Ba7 9. dxe5 Ng8 10. Qd5 0-1

관련 정보