단어를 찾고 싶은 거대한 파일이 있습니다.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
옵션을 사용합니다 . 이는 sed
GNU, *BSD, Mac OS에서sed
작동합니다. 가까운 미래에 POSIX 표준이 될 것입니다.-E
-r
sed
-E
기본 정규식 버전은 다음과 같습니다.
sed -n -e '/-pattern/ s/^\([^-]*\)-[^=]*="\([^"]*\)"/\1 \2/p'
답변2
grep
GNU (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