cmd를 사용하여 sed
모든 패턴을 한 줄에 인쇄하고 싶습니다. 나는 grep -Pe
and 를 사용하여 이 작업을 수행하는 방법을 알고 있습니다 awk
. 나는 다음과 같이 시작했습니다:
$ sed 's/^.*label="\(.*\)" selected.*$/\1/g' <(echo 'smkj sld/6_ !label="snd 1" selected>lms slks.;label="snd 2" selected>lkwnl wlkmlabel="snd 3" selected>The following should not be printedlabel="')
snd 3
그러나 위의 내용은 snd 3
사이의 문자열 만 인쇄합니다.마지막label="
그리고 발생 " selected
. 모든 행에 정규 표현식의 모든 항목을 포함하는 방법은 무엇입니까?
답변1
이를 사용하면 GNU sed
아래와 같이 원하는 출력을 생성할 수 있습니다.
$ sed -Ee '
s/label="([^"]+)" selected[>]/\n\1\n/
s/.*\n(.*\n)/\1/
/\n/!d
P;D
' input.txt
산출:
snd 1
snd 2
snd 3
Perl
라이너로 할 수 있습니다 .
$ perl -lne 'print for /label="([^"]+)" selected[>]/g' input.txt
답변2
사용행복하다(이전 Perl_6)
~$ raku -ne '$/.join("\n").put if m:g/ label\= \" <(<-["]>+)> \" \h selected \> /;' <(printf 'smkj sld/6_ !label="snd 1" selected>lms slks.;label="snd 2" selected>lkwnl wlkmlabel="snd 3" selected>The following should not be printedlabel="')
snd 1
snd 2
snd 3
#OR
~$ raku -ne '$/.join("\n").put if m:g/ label\= \" <(<-[\c[QUOTATION MARK]]>+)> \" \h selected \> /;' <(printf 'smkj sld/6_ !label="snd 1" selected>lms slks.;label="snd 2" selected>lkwnl wlkmlabel="snd 3" selected>The following should not be printedlabel="')
snd 1
snd 2
snd 3
Raku는 Perl 제품군의 프로그래밍 언어이며 이 답변은 @RakeshSharma가 게시한 뛰어난 Perl 답변을 칭찬하기 위한 것입니다.
간단히 말해서, 이 Raku 답변은 @RakeshSharma와 동일한 접근 방식을 취합니다. "검소한 대 탐욕스러운" 일치를 사용하여 문제를 해결하려고 시도하지 말고 대신 인용된 대상 문자열에 내부 인용문이 없다는 것을 인식하십시오. 따라서 (@RakeshSharma와 유사) Raku에서는 사용자 정의를 선언합니다.부정적인문자 클래스 <-["]>+
, 다음으로 변환됨"
" 따옴표 없이 연속된 하나 이상의 문자. (궁금하신 경우, <+[…]>
더 간단히 말하면 <[…]>
맞춤식을 의미합니다.긍정적인캐릭터 클래스). 두 번째 답변은 정식 \c[QUOTATION MARK]
이름을 명시적으로 사용하므로 때로는 까다로운 참조 문제를 피하는 데 도움이 될 수 있습니다.
그러면 정규식의 나머지 부분은 다음과 같습니다.
- 필수 일치 항목 앞에는
label\= \"
- 필수 일치 항목 뒤에는
\" \h selected \>
(\h
가로 공백을 나타냄)이 옵니다. - 전체 정규식을 일치시킨 후 Raku의
<( … )>
캡쳐마크모든 것을 밖으로 던져라.
Raku의 $/
변수에는 최종 일치 항목이 포함되어 있으며 m:global/ … /
또는 m:g/ … /
일치 항목이 지정되었으므로 필요한 세 개의 일치 항목이 반환됩니다.