나에게 맞는 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)을 추출할 수 있습니다.yq
yq
$ yq '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine
배열의 요소를 별도의 행으로 원하는 경우 TotallyFake
끝에 다음을 추가하여 배열을 확장합니다.[]
$ yq '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine
yq
Andrey 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
가장 최근에 일치된 정규식을 재사용하도록 지시하는 특수 구문입니다.
이 점에 유의하시기 바랍니다의지하다TotallyFake
YAML 문서의 선택적 공백(배열의 마지막 요소 뒤의 빈 줄 )입니다.