파이프 문자가 포함된 정규식으로 grep

파이프 문자가 포함된 정규식으로 grep

파이프 문자가 포함된 정규식을 사용하여 grep을 시도하고 있습니다 |. 그러나 예상대로 작동하지 않습니다. |아래 첨부 이미지에 표시된 것처럼 정규식은 포괄적으로 일치하지 않습니다 .

여기에 이미지 설명을 입력하세요

이건 내 bash 명령이야

cat data | grep "{{flag\|[a-z|A-Z\s]+}}"

샘플 데이터는 다음과 같습니다

| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066
|{{flagicon|Kosovo}} ''[[Kosovo]]'' <ref name="KOS" group=Note>{{Kosovo-note}}</ref>
|{{flagicon|Somaliland}} [[Somaliland|Somaliland region]]
|{{flagicon|Palestine}} ''[[Palestinian Territories]]''{{refn|See the following on statehood criteria:

예상 출력은

| 155||NA||{{flag|Central African Republic}}||2.693||NA||0.000||0.000||0.019||0.271||0.281||0.057||2.066

그러나 그것을 테스트 한 결과Regex101.com, 예상대로 결과가 나왔습니다.

답변1

대체 검색 표현식(예: in , where match a literal ) 사이의 구분 기호로 grep허용되는 것으로 보입니다 .\||egrep\||

그 외에도 당신의 표현에는 다른 문제가 있습니다.

  • +egrep(또는 ) 에서만 지원됩니다 grep -E.
  • \s문자 그룹 내에서는 지원되지 않습니다 [].
  • |캐릭터 그룹에서는 필요성을 느끼지 못합니다 .

따라서 다음은 작동합니다 grep:-

grep "{{flag|[a-zA-Z ][a-zA-Z ]*}}" <temp

아니면 (덕분에글렌 잭맨님의 입력):-

grep "{{flag|[a-zA-Z ]\+}}" <temp

egrep문자 는 {}특별한 의미를 가지므로 이스케이프해야 합니다.

egrep "\{\{flag\|[a-zA-Z ]+\}\}" <temp

불필요한 사용을 제거했습니다 cat.

답변2

귀하의 요청은 포함된 줄을 추출하는 것 같습니다 flag|. may를 사용하는 grep것은 너무 복잡합니다.

여기에서 그것을 사용 sed하고 awk추출하기 위해 명령은 다음과 같습니다.

sed -r -n '/flag\|/p' /tmp/temp

awk 'match($0,/flag\|/){print}' /tmp/temp

관련 정보