텍스트 파일에서 여러 줄을 grep

텍스트 파일에서 여러 줄을 grep

텍스트 파일에서 여러 줄을 grep하는 방법을 아는 사람이 있습니까? 나는 많은 결과를 봤지만 여전히 제대로 작동하지 않습니다.

텍스트 파일 예:

x
x
x
---
start
a
b
c
d
---
x
x
x

나는 이것을 파일에서 얻고 싶습니다.

---
start
a
b
c
d
---

더 짧을 수도 있고(ab) 더 길 수도 있지만(abcdefg) 항상 다음으로 시작합니다.

---
start

그리고 다음으로 끝납니다:

---

감사합니다

답변1

다음 -z옵션을 사용할 수 있습니다 grep.

-z, --null-data 데이터 라인은 줄 바꿈 대신 0바이트로 끝납니다.

$ grep -zo -- '---.start[^-]*---' file
---
start
a
b
c
d
---

답변2

---항상 줄 뒤에 오는 "트릭" 부분이 텍스트에 존재하지 않는다고 확신하는 경우(예제에서처럼) start섹션 제목을 로 줄이고 ---다음을 사용할 수 있습니다.

sed -n '/---/,//p' text

위의 내용이 확실하지 않은 경우:

sed -n '/---/{n;/start/{:a H;n;/---/!ba;x;G;s/^/---/p;s/.*/\n---/;D}}' test


sed : /bin/sed executable
-n : sed option to avoid auto line printing
/---/ : Match a pattern of 3 "-"
n: Get the next line of input
/start/: Match a line "start"
:a : Build a label called "a" (For the loop)
H: Happend the line to the HOLD space (Save it)
n: Get the next line
/---/!: Test if the current line **is not** equal to: "---"
ba: Jump to the label 'a' if the test succede
x: Swap the Hold space and the Pattern space.
G: Get the line from the Hold space and append it to the Pattern space
s/^/---/p: Append to the start of the string a sequence of "---" and print the line
s/.*/\n---/: Replace the current line with a new line and an : "---"
D: Delete character in the current line (Pattern space) up to the  first new line character and start the next cycle with the remaining line

awk단락 모드에서:

awk -v h="---" -v h2="start" '                     
    f == 2
    $0 == h {f=1}
    f == 1 && h2 == $0 {print h;print;f++}
' test

답변3

@schrodigerscatcuriosity의 답변을 바탕으로 다음을 수행할 수 있습니다.

grep -zoP -- '(?s)\n---\nstart\n.*?\n---\n' file

-PPCRE 확장 및 (?s)fot용PCRE_DOTALL

---start언급 한 과 사이의 선택적 빈 줄의 경우

grep -zoP -- '(?s)\n---\n[\n\s]*start\n.*?\n---\n' file

답변4

다중 문자 RS 및 RT에 GNU awk를 사용하고 입력에 레코드 구분 기호로만 표시된다고 가정합니다 (예: 중간 레코드와 같은 것을 ---\n가질 수 없음 ).b---\n

$ awk -v RS='---\n' -v ORS= '/^start/ && RT{print RT $0 RT}' file
---
start
a
b
c
d
---

관련 정보