Sed는 정규 표현식의 일치 항목을 파일로 출력하지 않습니다.

Sed는 정규 표현식의 일치 항목을 파일로 출력하지 않습니다.

다음과 같은 문자열이 포함된 파일(data.txt)이 있습니다.

[?1h=
=> ["AD070517",
 "AD070518",
: ESCESCOOBB "AD070809",
 "NE0000013",
 "NE0000014",
: ESCESC[[66~~ "LG100085-097",
 "LG100085-098",
]

다음을 사용하여 배열에서 큰따옴표를 제외한 항목만 추출하려고 했습니다.

sed -r 's/([-A-Z0-9]+)"/\1/g' data.txt > clean.txt

~에 따르면이 정규식 조각, 내가 이해하는 한, 통제 그룹과 경쟁은 예상대로 작동했습니다.이 게시물sed에서 일치하는 항목만 출력하고 출력 스트림을 새 파일로 보낼 수 있어야 하지만 결과 clean.txt 파일은 아무것도 필터링되지 않은 data.txt의 정확한 복사본입니다.

답변1

귀하의 sed명령은 단순히 일치 항목을 출력해서는 안 됩니다.

s/pattern/replacement/g패턴만 교체 부품으로 교체했을 뿐 나머지는 그대로 유지됩니다.

실제로 출력물은 정확한 복사본이 아니라 "패턴이 제거된 복사본이어야 합니다.


당신은 사용하고 싶을 수도 있습니다grep

grep -Eo '[-A-Z0-9]+"' data.txt | sed 's/"$//' > clean.txt

또는

grep -Po '[-A-Z0-9]+(?=")' data.txt > clean.txt

답변2

일치하는 행만 표시하려면 -n을 사용하십시오.

sed -n -r 's/([-A-Z0-9]+)"/\1/g' data.txt > clean.txt

두 번째 질문에서는 원하지 않는 항목을 아무것도 없는 것으로 바꾸세요.

sed -n -r 's/^.*"([-A-Z0-9]+)".*/\1/g' data.txt > clean.txt

답변3

대체가 성공한 경우에만 sed에게 인쇄하도록 지시할 수 있습니다. 이 t명령을 사용하십시오. 지정된 태그(있는 경우)로 이동합니다. b나머지 코드를 건너뛰고 p교체된 줄을 인쇄합니다.

sed -n -r 's/.*"([-A-Z0-9]+)".*/\1/g;t a;b;:a p' 

마지막 두 줄에 누락된 큰따옴표 두 개를 추가해야 했습니다.

Perl을 사용하면 더 읽기 쉬울 수 있습니다.

perl -lne 'print $1 if /([-A-Z0-9]+)"/'

관련 정보