범위 내의 특정 행을 삭제하는 방법은 무엇입니까?

범위 내의 특정 행을 삭제하는 방법은 무엇입니까?

YAML 앞의 일부 특정 줄을 제거하고 싶습니다.

---
Author: aaaa
Title: bbbb
Time: cccc
Place: dddd
...

이전 콘텐츠에서 "제목:" 및 "위치:"가 포함된 행만 삭제하고 싶다고 가정해 보겠습니다.

이 단어가 포함된 다른 줄을 삭제하지 않으려면 이전 단어만 검색해야 합니다. 또한 모든 솔루션에서는 행 번호를 사용하지 않고 실제 단어를 선택 기준으로 사용하는 것이 바람직합니다.

어떤 도움이라도 대단히 감사하겠습니다. 감사합니다.


내 연구에는 다음이 포함됩니다.

이것- 한 번에 여러 단어 삭제

- 파일의 특정 영역 선택

답변1

YFM( YAML front matter) 에는 익숙하지 않지만이 페이지에 따르면그것파일의 첫 번째 콘텐츠여야 하며 세 개의 점선 사이에 설정된 유효한 YAML 형식이어야 합니다.. 이는 파일이 항상 존재하는 ---경우 로 시작하므로 YFM다음을 실행할 수 있음을 의미합니다.

sed -n '1{/^---$/!q};1,/^---$/{/^Title: \|^Place: /d};p' infile

즉, 첫 번째 줄이 uit 와 일치하지 않으면 --- q두 번째 태그가 두 번째 표현식을 변경하는 경우 이러한 패턴과 일치하는 모든 줄을 삭제합니다( 첫 번째 줄과 다음 줄 일치 사이에 d나타나는 경우 ) . 그러나 리터럴 포인트와 일치하려면 주의하세요. 예를 들어 일치하려면 또는 )를 사용하여 이스케이프해야 합니다 .1---
...sed...\.\.\.\.\{3\}

sed -n '1{/^---$/!q};1,/^\.\.\.$/{/^Title: \|^Place: /d};p' infile

답변2

heemayl의 sed 솔루션 외에도 grep 옵션이 있습니다.

grep -Ev '^Title:|^Place:' file.txt

설명하다:

  • grep -v는 Title: 또는 Place:가 포함된 행을 무시합니다.
  • grep -E는 두 개의 용어를 쌓습니다.
  • ^는 패턴이 줄의 시작 부분에 있어야 함을 의미합니다.

관련 정보