답변:
2 가지 :
-o옵션 이 필요 하므로 일치하는 항목 만 인쇄됩니다 (전체 줄 대신)-PPerl 정규 표현식을 사용 하는 옵션이 필요합니다. 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하기 위해 역 참조로 몇 번이나 씨름했는지 알고 있습니까?