sed에서 정규 표현식과 일치하는 첫 번째 줄 세트만 선택하는 방법은 무엇입니까? [복사]

sed에서 정규 표현식과 일치하는 첫 번째 줄 세트만 선택하는 방법은 무엇입니까? [복사]

나에게 맞는 sed의 다음 정규 표현식이 있습니다.

cat <<EOF | sed -E '/^([A-Z][a-z]+){2,}$/Q'
Nothing Relevant
TotallyFake:

- NowWeWant
- TheseLines
- AndAlsoThisLine                                                                                                       

ButNotThisLine
- OrThisLine          
EOF

이는 우리가 원하는 행만 출력하지만 헤더 행도 출력하는데 이는 좋지 않습니다. 그래서 주위를 둘러보며 /this/,/that/방법을 찾았고, 정말 멋지구나!라고 생각했어요. 첫 번째 PascalishCase 콘텐츠를 찾은 다음 첫 번째 빈 줄에서 중단할 수 있습니다.

그래서 나는 이것을 시도했습니다 :

cat <<EOF | sed -En '/^- ([A-Z][a-z]+){2,}$/,/^$/p'

Nothing Relevant
TotallyFake:

- NowWeWant
- TheseLines
- AndAlsoThisLine

ButNotThisLine
- OrThisLine
EOF

그런데... 그것은 나에게 그것을 주었다 OrThisLine. 이는 이상적이지 않습니다.

-sed를 사용하여 a로 시작하는 PascalText의 첫 번째 블록을 찾고 해당 행만 인쇄하려면 어떻게 해야 합니까 ?

[편집하다]

내용이 충분히 명확하지 않기 때문에 내가 원하는 결과는 다음과 같습니다.

- NowWeWant
- TheseLines
- AndAlsoThisLine

내 이해는 /this/,/that/첫 번째 항목이 발견 this되고 "this" 다음의 첫 번째 항목으로 이동 that하지만 ^$패턴이 첫 번째 빈 줄과 일치하지 않고 EOF와 일치하는 것 같습니다.

답변1

이것이 다음과 같은 YAML 파일이라고 가정합니다(배열 요소 들여쓰기는 선택 사항입니다).

---
Somesection:
Someothersection:
TotallyFake:
  - NowWeWant
  - TheseLines
  - AndAlsoThisLine

ButNotThisLine:
  - OrThisLine

TotallyFake...그리고 최상위 배열의 요소를 가져오고 싶습니다 .

Mike Farah(Linux에서 가장 일반적으로 사용됨)를 사용하여 TotallyFake다음과 같이 최상위 배열(YAML)을 추출할 수 있습니다.yqyq

$ yq '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine

배열의 요소를 별도의 행으로 원하는 경우 TotallyFake끝에 다음을 추가하여 배열을 확장합니다.[]

$ yq '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine

yqAndrey Kislyuk( 잘 알려진 JSON 프로세서 jq의 래퍼 ) 의 해당 명령을 사용합니다 .

$ yq -y '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine

여기서 옵션은 데이터를 YAML로 추출한다는 -y의미입니다 . yq이것이 없으면 JSON으로 인코딩된 배열(동등)을 얻게 됩니다 ["NowWeWant","TheseLines","AndAlsoThisLine"].

요소를 별도의 행으로 가져오려면 다음을 수행하세요.

$ yq -r '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine

-r옵션은 디코딩된("원시") 문자열을 제공합니다.


를 사용하여 sed입력을 구조화된 문서 형식의 문서가 아닌 텍스트로 처리합니다.

$ sed -e '/^TotallyFake:/,/^$/!d' -e '//d' file
- NowWeWant
- TheseLines
- AndAlsoThisLine

그러면 관심 있는 섹션 외부의 모든 줄이 제거되고 두 번째 d명령을 사용하여 실제 범위의 시작 및 끝 줄이 제거됩니다. 빈 정규식은 sed가장 최근에 일치된 정규식을 재사용하도록 지시하는 특수 구문입니다.

이 점에 유의하시기 바랍니다의지하다TotallyFakeYAML 문서의 선택적 공백(배열의 마지막 요소 뒤의 빈 줄 )입니다.

관련 정보