다음 명령이 있습니다.
unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | grep ":taxonomies-" | head -1
이것은 나에게 출력을 제공합니다.
<j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>
하지만 추출만 하면 됩니다.분류-8.2.0위의 전체 문자열 대신.
답변1
-o
한 가지 방법은 grep의 옵션을 다음과 결합하여 사용하는 것입니다.PCRE( -P
):
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
그래서, 당신은 이것을 할 수 있습니다
unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | grep -oP ':\Ktaxonomies-[^"]*' | head -1
\K
해당 지점까지 일치하는 모든 항목이 무시되고(따라서 :
인쇄되지 않음) " [^"]*"
문자가 아닌 문자를 최대한 많이 일치" 함 을 의미합니다."
기타 옵션은 다음과 같습니다.
sed
unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | sed -n 's/.*:\(taxonomies-[^"]*\).*/\1/p' | head -1
명시적으로 지시하지 않는 한 아무 것도 인쇄되지 않으며
-n
대체 연산자입니다. 줄의 모든 내용을 괄호( ) 사이의 부분으로 대체합니다. 이로 인해 결과 줄이 인쇄됩니다.sed
s///
\1
p
펄
unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | perl -lne 's/.*:(taxonomies-[^"]).*/$1/ && print' | head -1
와 같은 기본 아이디어입니다
sed
. 교체가 성공하면 라인을 인쇄합니다. 또 다른 옵션은unzip -p GLP.K4C.S06F5.BG57218-rdf.zip | perl -lne '/.*:(taxonomies-[^"])/ && print $1' | head -1
답변2
무슨 일이 일어났는지 안다면:입력의 문자에 대해 유사한 작업을 수행할 수 있습니다.
echo " <j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>" |
awk -F\: '{print $4}' | sed 's/..$//'
이 명령은 awk
다음 네 번째 문자열을 인쇄합니다.:구분 기호인 경우 이 sed
명령은 원하는 출력을 얻기 위해 마지막 2자를 제거하는 데 사용됩니다.
그러나 이 방법의 작동 여부는 입력 내용에 따라 다릅니다.Tedden이 댓글에서 지적했습니다..
편집하다
sed
제안된 솔루션을 사용하면 최종 파이프라인을 피할 수 있습니다.제이슨 라이언 존재하다논평. 따라서 명령은 실제로 다음과 같이 다시 작성할 수 있습니다.
echo " <j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>" |
awk -F: '{sub(/\/>/,""); print $4}'
cut과 rev만을 사용하는 또 다른 솔루션은 다음과 같이 구성될 수 있습니다.
echo " <j.2:Taxo_Version rdf:resource="refmat:taxonomies-8.2.0"/>" |
cut -d ':' -f4 | rev | cut -c 3- | rev
다시 말하지만, 구분 기호의 사양은 입력 파일에 따라 다르며 제공한 예에서 추출해야 하는 문자는 구분 기호 의 네 번째 위치 뒤에 나타납니다 . 나는 네 번째 구분 기호 뒤의 하위 문자열을 추출 cut
하고 좋은 오래된 기술을 사용하여 문자열을 반전하고 마지막 3자를 제거한 다음 다시 적용하여 실제 문자열을 얻었습니다.rev
rev