Bash 컨텍스트에서 추출하고 싶습니다.모든 텍스트서로 다른 라인에 있지만 전체 라인을 구성하지 않는 두 패턴 사이에서 발생합니다. 그래서 특별히 패턴이 나타나는 줄에 텍스트를 인쇄하고 싶지만 시작 패턴 뒤에서 시작하고 중지 패턴 앞에서 끝나도록 하겠습니다.
- 예를 들어 입력이 다음과 같은 경우:
This is line 1 Something else Line 3
This
그리고 패턴은3
- 그러면 원하는 출력은 다음과 같습니다.
is line 1 Something else Line
답변1
grep
GNU , Lookbehind (?<=This )
및 Lookahead 사용 (?= 3)
:
grep -Poz '(?<=This )(.|\n)*(?= 3)' file
산출:
1호선이에요 다른 것들 철사
참조: man grep
및스택 오버플로 정규식 FAQ
답변2
Perl이 구조에 옵니다:
perl -0777 -ne 'BEGIN { ($f, $t) = (shift, shift) }
/$f\s*(.*)\s*$t/s and print $1
' This 3 input.txt
-0777
전체 파일을 메모리로 읽어와 처리하는 것을 의미하는 "후루룩 모드"를 켭니다.-n
코드를 통한 입력을 처리합니다.- 처음에 처음 두 매개변수는 $f 및 $t 변수에 저장됩니다.
- 입력에 두 패턴 사이의 항목이 포함되어 있으면 $1에 저장되고 인쇄됩니다.
답변3
확장 정규 표현식 모드의 GNU sed
sed -E '
/This/,/3/ s/(^|\s+)(This|3)(\s+|$)//
' file
검색어 This가 다른 텍스트에는 나타나지 않는다고 가정합니다.
답변4
그리고 sed
:
$ cat file
This is line 1
This is Something else
Line 3
Line 33
This is more
data here
The 3rd bumblebee was never seen
$ sed -n '/.*This /,/ 3.*/ { s///; p; }' file
is line 1
This is Something else
Line
is more
data here
The
sed
입력 파일을 출력하는 스크립트 부분을 편집합니다 . 각 섹션은 시작 패턴과 일치하는 줄로 시작 .*This
하고 끝 패턴과 일치하는 줄로 끝납니다 3.*
. 또한 스크립트는 시작 줄에서 시작 패턴과 일치하는 하위 문자열을 제거하고 끝 줄에서 끝 패턴과 일치하는 하위 문자열을 제거합니다.
또는,
$ sed -e '/.*This /,/ 3.*/!d' -e 's///' file
is line 1
This is Something else
Line
is more
data here
The
이는 동일한 효과를 가지지만 다르게 표현됩니다. 입력에서 원하는 부분이 아닌 부분을 제거하고, 출력하기 전에 원하는 각 부분의 시작선과 끝선을 잘라냅니다.