항목이 많은 파일이 있습니다. 특정 컴포넌트의 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.inst
print 만 abcd.inst
해결 방법은 정규식을 사용하여 전체 출력을 캡처하는 것입니다. grep -oP 'abcd.inst[^"]+'
당신이 원하는 것을 할 것입니다. 이 -P
플래그는 Perl 스타일 모드를 활성화하며 다음 인용문과 일치하도록 모드가 수정되었습니다.이것은 링크입니다패턴이 하는 일을 정확하게 설명하는 도구입니다.
답변2
문서가 JSON 문서인 경우 JSON 파서를 사용하여 구문 분석해야 합니다. id
문서에서 키를 찾을 수 있는 위치를 모르고 이 작업을 수행하는 것은 어색하지만 가능합니다. 아래에서는 값이 문자열로 시작하는 경우 jq
전체 문서의 모든 키에서 모든 값을 추출하는 데 사용합니다.id
abcd.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
터미널로 출력됩니다.