sed를 사용하여 파일에서 3문자만 포함된 단어 찾기

sed를 사용하여 파일에서 3문자만 포함된 단어 찾기

3자로 구성된 단어만 인쇄하면 되지만 단어 문서는 번호가 매겨진 목록입니다.

제가 대답해야 할 정확한 질문은 다음과 같습니다.

파일에서 문자 클래스 명령을 사용하여 sed길이가 3자에 불과한 모든 동물 이름을 찾으세요.[[:lower:]]animals(3점).

내가 시도한 것은 다음과 같습니다.

cat animals | sed '/{[:lower:]].../d'  
cat animals | sed '/{[:lower:]]/d' 
sed '/[[:lower:]]{3}/d' animals

animals이것은 (파일)에서 단어를 찾으려는 파일입니다.

01. aardvark
02. badger
03. cow
04. dog
05. elephant
06. fox
07. goose
08. horse
09. iguana
10. jackal
11. koala
12. lamb
13. mongoose
14. narwhal
15. onyx
16. pig
17. quail
18. rat
19. snake
20. tiger
21. umbrellabird
22. vulture
23. walrus
24. xerus
25. yak
26. zebra

방금 코드에서 [[:lower:]]를 여러 번 사용할 수 없다는 것을 발견했습니다. 이를 수행할 수 있는 방법이 있습니까?

답변1

sed스트림 편집기입니다. 즉, 텍스트를 읽고, 편집하고, 결과를 출력합니다. 반드시 파일을 처리할 필요는 없으며 텍스트 스트림만 처리하면 됩니다. (귀하의 경우 텍스트 스트림은 파일에서 나오므로 실제 차이는 없습니다.)

다음을 사용하여 sed몇 가지 옵션이 있습니다.

  1. 세 개의 연속된 소문자를 포함하지 않는 모든 줄을 제거하면 나머지 줄은 전달되고 인쇄됩니다.
  2. 정확히 세 개의 연속된 소문자를 포함하는 줄만 인쇄합니다.

두 경우 모두 해당 세 문자 앞에 공백이 있고 그 뒤에 아무 것도 없는지 확인해야 합니다.

그러면 4자 이상의 단어가 일치하고 일치하는 줄이 삭제됩니다. 시퀀스의 끝을 바인딩하지 않으므로 더 긴 시퀀스의 중간에 일치하게 됩니다.

sed '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' animals

이것은 주어진 파일에 대해 작동하지만 두 글자(또는 심지어 한 글자)를 가진 동물이 있을 가능성을 고려하지 않습니다. (예를 들어, "소"를 생각해 보세요). 그러므로 우리는 그들을 제거해야 합니다. 이 시점에서 우리는 sed여러 작업이 순서대로 적용되어야 함을 각 행에 알려야 합니다 . 또한 $정규 표현식이 줄 끝에 바인딩되어야 함을 선언하는 새 문자를 도입해야 합니다 .

  • 한 줄에 4개의 문자가 있으면 해당 줄을 삭제하세요.
  • 공백, 두 글자, 그리고 줄의 끝을 찾으면 줄을 삭제하십시오.
  • 공백, 문자, 그리고 줄의 끝을 찾으면 줄을 삭제하십시오.

이는 다음과 같이 긴 형식으로 작성할 수 있습니다.

sed -e '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' -e '/ [[:lower:]][[:lower:]]$/d' -e '/ [[:lower:]]$/d' animals

적합한 버전이 있으면 sed더 읽기 쉬운 형식으로 축소할 수 있습니다. ( -r깃발을 찾아보세요 .)

답변2

나는 sed (GNU sed) 4.2.2당신이 원하는 결과를 사용하고 얻고 있습니다 :

sed 's/^[[:digit:]]\{2\}[[:punct:]][[:space:]]\([[:lower:]]\{3\}\)/\1/gm' animals.txt | sed '/[[:lower:]]\{4\}/d'

다음 단계를 수행합니다.

  1. 2자리 숫자로 시작하고 구두점("."), 공백, 최소 3개의 소문자가 포함된 단어가 이어지는 줄을 찾으세요.
  2. 이 행에서 일치하는 소문자 그룹을 선택합니다.
  3. 이전 단계의 결과에 따라 4개 이상의 소문자가 포함된 단어를 제거합니다.

정확히 3개의 소문자를 포함하는 단어만 출력합니다.

cow
dog
fox
pig
rat
yak

참고로 GNU sed는 다음을 사용합니다.이 정규식 구문.

답변3

가장 직접적인 방법은 다음과 같습니다.

$ sed -n '/^....[a-z]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

사용 요구 사항을 충족하려면 [[:lower:]]다음과 같이 위의 내용을 수정할 수 있습니다.

$ sed -n '/^....[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

....명시적으로 크기가 지정된 시퀀스로 전환할 수도 있습니다 .

$ sed -n '/^.\{4\}[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

인용하다

답변4

당신은 가깝습니다. 3가지 요소를 일치시키는 기본 아이디어는 올바른 방향으로 나아가는 것입니다.

{}백슬래시가 필요(또는 사용 -E) 되어 BRE에 구문 오류가 있습니다 .

그러나 정규 표현식:은 [[:lower:]]\{3\}3개 또는수치.

당신은해야합니다space( )부터 end( ) 까지의 정규식 $:

$ <infile sed -n '/ [[:lower:]]\{3\}$/p'

기본적으로 이 명령은 인쇄하지 않고 일치하는 행에만 p인쇄합니다 . 다음과 같이 반대로 작성할 수도 있습니다.

$ <infile sed '/ [[:lower:]]\{3\}$/!d'

즉: 기본 인쇄, 한 줄씩 인쇄아니요일치하면 ( d)을 삭제하세요.

또는 단어 경계를 사용할 수 있습니다.

$ <infile sed '/\b[[:lower:]]\{3\}\b/!d'

또는:

$ <infile sed '/\<[[:lower:]]\{3\}\>/!d'

아마도 ERE 정규 표현식을 사용해보세요:

$ <infile sed -E '/\b[[:lower:]]{3}\b/!d'

동물 이름만 원하면 다음을 사용하세요.

$ <infile sed -E '/.*\<([[:lower:]]{3})\>/!d;s//\1/'
cow
dog
fox
pig
rat
yak

관련 정보