답변:
2 가지 :
-o
옵션 이 필요 하므로 일치하는 항목 만 인쇄됩니다 (전체 줄 대신)-P
Perl 정규 표현식을 사용 하는 옵션이 필요합니다. Perl 정규 표현식에는 미리보기 (?= )
및 뒤에 찾기 와 같은 유용한 요소가 포함되어 있습니다. 이러한 요소 (?<= )
는 부품을 찾지 만 실제로는 일치하지는 않습니다.Parensis 내부의 부분 만 일치 시키려면 다음을 수행하십시오.
grep -oP '(?<=\/\()\w(?=\).+\/)' myfile.txt
파일에 sting이 포함되어 있으면 /(a)5667/
grep은 다음과 같은 이유로 'a'를 인쇄합니다.
/(
에 의해 발견 \/\(
되지만 보고 뒤에 있기 때문에 (?<= )
보고되지 않습니다.a
로 일치 \w
하여 인쇄됩니다 (때문에 -o
))5667/
<B 발견 \).+\/
,하지만 그들이에 있기 때문에 예견 (?= )
그들은보고되지 않습니다의 -o
옵션을 사용하십시오 grep
.
예 :
$ echo "foobarbaz" | grep -o 'b[aeiou]r'
bar
괄호 안에있는 항목 만 원하면 하위 일치 (명명 된 또는 캡처 된 캡처 그룹) 캡처를 지원하는 항목이 필요합니다. 나는 grep이나 egrep이 이것을 할 수 있다고 생각하지 않는다. perl과 sed는 할 수있다. 예를 들어, perl을 사용하면 :
foo라는 파일에 다음과 같은 줄이있는 경우 :
/adsdds /
그리고 당신은 :
perl -nle 'print $1 if /\/(\w).+\//' foo
문자 a가 반환됩니다. 그것은 당신이 원하는 것이 아닐 수도 있습니다. 일치시키려는 내용을 알려 주면 더 나은 도움을받을 수 있습니다. $ 1은 첫 번째 괄호 세트에서 캡처 한 것입니다. 두 번째 세트는 $ 2입니다.
shell 외에도 bash 로 질문에 태그를 지정했기 때문에 grep 외에 다른 해결책이 있습니다 .
Bash에는 =~
Perl과 마찬가지로 연산자를 사용하여 버전 3.0부터 자체 정규식 엔진이 있습니다.
이제 다음 코드가 주어집니다.
#!/bin/bash
DATA="test <Lane>8</Lane>"
if [[ "$DATA" =~ \<Lane\>([[:digit:]]+)\<\/Lane\> ]]; then
echo $BASH_REMATCH
echo ${BASH_REMATCH[1]}
fi
bash
아니라 그대로 호출해야 sh
합니다.$BASH_REMATCH
전체 정규 표현식과 일치하는 전체 문자열을 제공하므로 <Lane>8</Lane>
${BASH_REMATCH[1]}
첫 번째 그룹과 일치하는 부분을 제공하므로 8
>
의해 분출 된 XML과 FASTA 데이터 (모두 완전히 다른 목적으로 기호를 사용함)의 끔찍한 혼합을 분석하고 있습니다. 물론 두 형식 모두 이스케이프없이 인터레이스됩니다. 따라서 표준 XML 라이브러리를 던질 수는 없습니다. 그리고 나는 코드 의이 시점에서 Bash 정규 표현식을 사용하고 있습니다. 왜냐하면 두 개의 데이터 만 추출하면되므로 2 정규 표현식 이이 혼란에 대한 전용 파서를 작성하는 것보다 훨씬 더 잘 작동합니다. #LifeInBioinformatics
파일에 다음이 포함되어 있다고 가정합니다.
$ cat file
Text-here>xyz</more text
그리고 당신은 문자 (들) 사이의 원하는 >
과 </
, 당신이 중 하나를 사용할 수 있습니다 :
grep grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl perl -nle 'print $1 if />(\w+)<\//' file
모두 문자열 "xyz"를 인쇄합니다.
이 줄의 숫자를 캡처하려면 다음을 수행하십시오.
$ cat file
Text-<here>1234</text>-ends
grep grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl perl -nle 'print $1 if />([0-9]+)<\//' file
sed
하기 위해 역 참조로 몇 번이나 씨름했는지 알고 있습니까?