조건부 패턴 찾기

조건부 패턴 찾기

단어를 찾고 싶은 거대한 파일이 있습니다.pattern. 나는 예를 들어 내 상황을 설명하려고 노력했습니다.

내 파일 어딘가에 내가 가지고 있다고 가정 해 봅시다.

Sample-pattern="abc"

Sample하이픈 앞의 단어 abc와 따옴표 안의 단어를 에코하는 스크립트를 작성하고 싶습니다.

그래서 있다면

Sample2-pattern="xyz"

그것은 울릴 Sample2것이고xyz

pattern해당 단어가 파일의 다른 곳에 있을 수도 있습니다. 그러나 pattern단어 앞에 하이픈 이외의 다른 문자가 있으면 스크립트는 이를 무시해야 합니다. 예를 들어 다음과 같은 경우

Sample3pattern.....

이를 무시해야 합니다.

답변1

입력이 있습니다 file.txt:

Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="def"

다음 sed스크립트는 다음 출력을 생성합니다.

$ sed -E -n -e '/-pattern/ s/^([^-]*)-[^=]*="([^"]*)"/\1 \2/p' file.txt
Sample abc
Sample2 xyz

위 스크립트는 sed한 줄의 첫 번째 문자 앞의 모든 텍스트와 -한 줄의 첫 번째 문자 뒤의 큰따옴표 안의 모든 텍스트를 인쇄합니다. =정규식과 일치하지 않는 줄은 인쇄하지 않습니다( /-pattern/주소 지정과 s///검색 및 바꾸기 모두).

참고: 확장 정규식을 활성화하려면 -E옵션을 사용합니다 . 이는 sedGNU, *BSD, Mac OS에서sed 작동합니다. 가까운 미래에 POSIX 표준이 될 것입니다.-E-rsed-E

기본 정규식 버전은 다음과 같습니다.

sed -n -e '/-pattern/ s/^\([^-]*\)-[^=]*="\([^"]*\)"/\1 \2/p'

답변2

grepGNU (Linux의 기본값) 에 액세스할 수 있는 경우 다음을 수행할 수 있습니다.

grep -Po '\w+-pattern="[^"]+' file

공백이 아닌 모든 문자와 일치할 수 -E있는 확장 정규식을 활성화합니다 . 행에서 일치하는 부분 \S-o인쇄 됩니다. grep정규식 자체는 하나 이상의 공백이 아닌 문자( \S+)를 찾은 다음 -pattern="하나 이상의 공백이 아닌 "문자( [^"]+)를 찾습니다. 따라서 다음과 같은 파일이 제공됩니다.

$ cat file
Sample-pattern="abc"
Sample2-pattern="xyz"
Sample3pattern="foo"

grep명령은 다음을 반환합니다.

$ grep -Eo '\S+-pattern="[^"]+' file 
Sample-pattern="abc
Sample2-pattern="xyz

그런 다음 다음 을 통해 sed삭제할 수 있습니다 -pattern=".

$ grep -Eo '\S+-pattern="[^"]+' file | sed 's/-pattern="/ /'
Sample abc
Sample2 xyz

관련 정보