텍스트 파일에서 여러 줄을 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
-P
PCRE 확장 및 (?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
---