다음과 같은 문자열이 포함된 파일(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]+)"/'