
정렬되지 않은 단어 목록이 두 개 있고 선택한 특정 문자를 제외한 새 단어 목록을 생성하여 순서대로 정렬하고 싶습니다. 다음 명령을 시도했습니다.
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
문자로 완전히 구성되지 않는 한 올바른 것임 )를 의미하는 반면, 두 번째 명령은 "세트에 없는 문자를 포함하는 문자를 찾으십시오"입니다. 집합에서" "설정 " 행을 인쇄한 다음 "집합이 포함된 행을 찾아 " 입력에서 제거합니다.h
l
r
w
hlrw
hlrw
답변2
하지만 여기서는 그럴 필요가 없습니다 sed
. 다음을 수행할 수 있습니다.
grep -v '[hlrw]'
첫 번째(비표준) 항목은 다음 sed -e 's/\s/\n/g'
으로 대체될 수도 있습니다.
tr -s '[:space:]' '[\n*]'
모든 공백 시퀀스를 개행 문자로 음역하고 압축합니다.
이는 실제로 사용을 정당화합니다 ( 파일 이름을 인수로 사용하여 직접 읽을 수 있으므로 에는 cat
필요하지 않습니다 ).sed
sed
따라서 대체 구문은 다음과 같습니다.
cat roa7.lst gr7.usl | tr -s '[:space:]' '[\n*]' | grep -v '[hlrw]' | sort -u | less -N
이렇게 하면 sed
.