실제로 텍스트 파일에서 각 단어의 빈도를 생성하는 데 도움이 되는 코드 조각을 온라인에서 찾았지만 누군가가 이를 수행하는 방법을 정확히 설명하고 싶습니다.
특히 sed 명령입니다. 저는 bash를 처음 접했고 모든 구분 기호( )가 무엇을 하는지 알아야 하기 때문입니다 s/\(.*\)/\L\1/
.
코드는 다음과 같습니다.
cat EnglishText.txt
sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g' EnglishText.txt | sort | uniq -c
sed 후에 정확히 무슨 일이 일어나는지 알고 싶습니다. uniq -c와 정렬은 이해하지만 매칭 등에서 무슨 일이 일어나는지 알고 싶습니다. 이것이 약간 이상하다는 것을 알지만 다시 한번 이것에 대해 매우 낯설게 느껴집니다.
같은 질문의 맥락에서
sed 's/\([0-9]*\).*/\1/'
그게 무슨 뜻이야?
답변1
스크립트 sed
는 세 가지 대체 명령으로 구성됩니다. 바꾸기 명령은 s/old/new/
텍스트에서 정규식 old
과 일치하는 항목을 찾아 로 바꾸는 형식을 취합니다 new
. g
명령 뒤에 a가 있으면 이 대체가 반복적으로 수행됩니다("전역"). 첫 번째는 마침표를 제거합니다. 두 번째는 텍스트를 소문자로 만듭니다. 세 번째는 각 단어를 한 줄에 배치합니다. 더 자세하게:
s/\.//g
이는 입력의 마침표와 일치하고 아무 것도 대체하지 않습니다.
s/\(.*\)/\L\1/
이는 입력의 모든 항목과 일치하며 동일한 콘텐츠의 소문자 버전으로 대체됩니다.
s/\ /\n/g
이는 공백을 개행 문자로 대체합니다. 이는 각 단어를 별도의 줄에 배치하는 효과가 있습니다.
예
마침표가 제거되고 모든 단어가 소문자로 별도의 줄에 배치됩니다.
$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g'
this
test
is
this
test
이 양식은 정렬 및 계산에 적합합니다.
$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g' | sort | uniq -c
1 is
2 test
2 this
개선하다
작성된 대로 sed
스크립트는 다른 구두점 문자(예 ?"!
: 또는 탭)에 대해서는 아무 작업도 수행하지 않습니다. 위 코드를 약간 수정하면 모든 문제를 처리할 수 있습니다.
$ echo 'This "test(?)" is this test!' | sed 's/[[:punct:]]//g; s/.*/\L&/; s/[[:space:]]/\n/g' | sort | uniq -c
1 is
2 test
2 this
이는 몇 가지 사소한 변경 사항만 제외하고 원래 명령과 동일한 유형의 대체 명령을 사용합니다.
s/[[:punct:]]//g
모든 구두점을 제거하세요.s/.*/\L&/
모든 대문자를 소문자로 변환합니다.s/[[:space:]]/\n/g
모든 공백을 줄 바꿈으로 바꿉니다.
부록
줄이 숫자로 시작하는 경우 sed 's/\([0-9]*\).*/\1/'
해당 숫자를 유지하고 그 뒤의 모든 항목을 삭제합니다. 다른 모든 행은 삭제됩니다. 예를 들어:
$ echo '123 tests' | sed 's/\([0-9]*\).*/\1/'
123
$ echo 'There are 123 tests' | sed 's/\([0-9]*\).*/\1/'