나는 단순히 정규 표현식에서 일치를 가져와야합니다.
$ cat myfile.txt | SOMETHING_HERE "/(\w).+/"
출력은 괄호 안에 일치하는 것만 있어야합니다.
grep 이 전체 줄과 일치하므로 grep 을 사용할 수 있다고 생각하지 마십시오 .
이 작업을 수행하는 방법을 알려주십시오.
답변
2 가지 :
- @Rory에서 언급했듯이
-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
답변
sed -n "s/^.*\(captureThis\).*$/\1/p"
-n don't print lines
s substitute
^.* matches anything before the captureThis
\( \) capture everything between and assign it to \1
.*$ matches anything after the captureThis
\1 replace everything with captureThis
p print it
답변
괄호 안에있는 항목 만 원하면 하위 일치 (명명 된 또는 캡처 된 캡처 그룹) 캡처를 지원하는 항목이 필요합니다. 나는 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
답변
파일에 다음이 포함되어 있다고 가정합니다.
$ 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
답변
이것은 당신이 요구하는 것을 성취 할 것이지만, 그것이 당신이 정말로 원하는 것이라고 생각하지 않습니다. 나는 .*
정규식 앞에를 넣어 일치하기 전에 아무것도 먹지 만 욕심 많은 조작이므로 \w
문자열 의 두 번째 문자 만 일치 합니다.
parens 및을 이스케이프해야합니다 +
.
sed 's/.*\(\w\).\+/\1/' myfile.txt