Grep은 전체 단어를 추출합니다(따옴표 제외).

Grep은 전체 단어를 추출합니다(따옴표 제외).

항목이 많은 파일이 있습니다. 특정 컴포넌트의 ID를 추출하고 싶습니다. ID 앞에는abcd.inst 같은 단어 하나만 의미합니다.

abcd.inst.sdt.gh-wer-1.anrg6ljrgo5rdtyc25lgtr2wf7iuhu2f5scwehpjjzerzpnphn3tzy4w2wjq

내가 할 때마다

cat abcd.txt | grep "abcd.inst"

내가 얻는 결과는 다음과 같습니다.

"id": "abcd.inst.sdt.gh-wer-1.anrg6ljrgo5rdtyc25lgtr2wf7iuhu2f5scwehpjjzerzpnphn3tzy4w2wjq"

어쨌든 출력을 다음과 같이 만드는 것이 가능합니까?

abcd.inst.sdt.gh-wer-1.anrg6ljrgo5rdtyc25lgtr2wf7iuhu2f5scwehpjjzerzpnphn3tzy4w2wjq

사용하다 지쳤어요

grep -oh abcd.inst abcd.txt

그러나 출력은

abcd.inst

답변1

grep -o일치하는 텍스트만 출력하므로 grep -o abcd.instprint 만 abcd.inst해결 방법은 정규식을 사용하여 전체 출력을 캡처하는 것입니다. grep -oP 'abcd.inst[^"]+'당신이 원하는 것을 할 것입니다. 이 -P플래그는 Perl 스타일 모드를 활성화하며 다음 인용문과 일치하도록 모드가 수정되었습니다.이것은 링크입니다패턴이 하는 일을 정확하게 설명하는 도구입니다.

답변2

문서가 JSON 문서인 경우 JSON 파서를 사용하여 구문 분석해야 합니다. id문서에서 키를 찾을 수 있는 위치를 모르고 이 작업을 수행하는 것은 어색하지만 가능합니다. 아래에서는 값이 문자열로 시작하는 경우 jq전체 문서의 모든 키에서 모든 값을 추출하는 데 사용합니다.idabcd.inst

jq -r ' .. |
        select( type == "object" and
                has("id") and
                (.id | startswith("abcd.inst"))
        ).id' file.json

명령줄에서 찾고 있는 문자열을 에 전달할 수도 있습니다 jq.

jq -r --arg string 'abcd.inst' '
        .. |
        select( type == "object" and
                has("id") and
                (.id | startswith($string))
        ).id' file.json

문서를 일반 텍스트로 처리하면 이를 사용 sed하여 찾고자 하는 문자열을 추출할 수 있습니다. 이는 데이터가 질문 텍스트에 있는 것과 같고 및 하위 문자열과 같은 줄에 다른 데이터가 없다고 가정 "id":합니다 "abcd.inst. 또한 우리가 추출하는 문자열에는 큰따옴표가 포함되어 있지 않으며 디코딩을 위해 어떤 방식으로든 인코딩할 필요가 없다고 가정해야 합니다.

sed     -e '/^[[:blank:]]*"id":[[:blank:]]*"abcd\.inst/!d' \
        -e 's/"[^"]*$//' \
        -e 's/.*"//' file

위의 명령은 파일에서 다음으로 시작하지 않는 모든 줄을 sed삭제합니다 (줄의 시작 부분과 지정된 두 하위 문자열 사이에 선택적 공백이나 탭이 있음)."id":"abcd.inst

두 번의 후속 교체는 위에서처럼 삭제하지 않은 줄을 잘라냅니다. 첫 번째 교체는 해당 줄의 마지막 큰따옴표와 그 뒤의 모든 내용을 제거합니다. 두 번째 대체는 줄의 시작부터 첫 번째 대체에 의해 생성된 줄의 마지막 큰따옴표까지 모든 것을 제거합니다.

이러한 작업 후에 우리가 찾고 있는 하위 문자열은 줄에 남아 sed터미널로 출력됩니다.

관련 정보