sed에서 특정 문자가 포함된 행 필터링

sed에서 특정 문자가 포함된 행 필터링

정렬되지 않은 단어 목록이 두 개 있고 선택한 특정 문자를 제외한 새 단어 목록을 생성하여 순서대로 정렬하고 싶습니다. 다음 명령을 시도했습니다.

 cat roa7.lst gr7.usl | sed -e 's/\s/\n/g' | sed -n 's/[^hlrw]/&/p' | sort -u | less -N

그러나 마지막 sed 명령은 문자 집합이 포함된 행을 제외하려고 시도했지만 [hlrw]이러한 단어를 제외하는 데 실패했습니다. 어떻게 든 나는 구분 기호 내부의 캐럿의 유용성을 놓쳤습니다. 이 파이프를 어떻게 고치나요?

답변1

마지막 명령의 올바른 구문 sed은 다음과 같습니다.

sed -n '/[hlrw]/!p'

또는

sed '/[hlrw]/d'

거의 같습니다. 해당 awk절차는 다음과 같습니다.

awk '!/[hlrw]/'

원래 예에서 잘못된 명령은 "세트에 없는 문자를 포함합니다 "(행이 , , 또는 hlrw문자로 완전히 구성되지 않는 한 올바른 것임 )를 의미하는 반면, 두 번째 명령은 "세트에 없는 문자를 포함하는 문자를 찾으십시오"입니다. 집합에서" "설정 " 행을 인쇄한 다음 "집합이 포함된 행을 찾아 " 입력에서 제거합니다.hlrwhlrwhlrw

답변2

하지만 여기서는 그럴 필요가 없습니다 sed. 다음을 수행할 수 있습니다.

grep -v '[hlrw]'

첫 번째(비표준) 항목은 다음 sed -e 's/\s/\n/g'으로 대체될 수도 있습니다.

tr -s '[:space:]' '[\n*]'

모든 공백 시퀀스를 개행 문자로 음역하고 압축합니다.

이는 실제로 사용을 정당화합니다 ( 파일 이름을 인수로 사용하여 직접 읽을 수 있으므로 에는 cat필요하지 않습니다 ).sedsed

따라서 대체 구문은 다음과 같습니다.

cat roa7.lst gr7.usl | tr -s '[:space:]' '[\n*]' | grep -v '[hlrw]' | sort -u | less -N

이렇게 하면 sed.

관련 정보