program story

단어 목록을 만들기 위해 모든 공백을 줄 바꿈 / 단락 표시로 바꿉니다.

inputbox 2020. 11. 26. 08:15
반응형

단어 목록을 만들기 위해 모든 공백을 줄 바꿈 / 단락 표시로 바꿉니다.


나는 우리가 수업 중에 번역하고있는 그리스어 텍스트의 어휘 목록을 시도하고 있습니다. 모든 단어가 한 줄에 나타나도록 모든 공백이나 탭 문자를 단락 기호로 바꾸고 싶습니다. 누구든지 sed 명령을 내리고 내가하는 일을 설명 할 수 있습니까? 나는 아직도 sed를 알아 내려고 노력하고있다.


합리적으로 최신 버전의 sed의 경우 표준 입력을 편집하여 다음과 같은 표준 출력을 생성하십시오.

$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος

어휘가 lesson1라는 파일 lesson2에있는 경우 sed의 표준 출력을 다음을 사용하여 파일 all-vocab리디렉션합니다 .

sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab

의미 :

  • 문자 클래스는 [[:blank:]] 하나의 공백 문자 또는 단일 탭 문자 중 하나와 일치합니다.
    • [[:space:]]대신 사용 하여 단일 공백 ​​문자 (일반적으로 공백, 탭, 줄 바꿈, 캐리지 리턴, 용지 공급 및 세로 탭)와 일치시킵니다.
    • +정량 수단은 하나 또는 그 이전의 형태를보다 잘 일치 .
    • [[:blank:]]+모두 공백 또는 탭인 하나 이상의 문자 시퀀스도 마찬가지 입니다.
  • \n교체에 당신이 원하는 것을 줄 바꿈이다.
  • /g끝에 있는 수정자는 한 번이 아니라 가능한 한 많이 대체를 수행함을 의미합니다.
  • -E옵션은 sed에게 POSIX 확장 정규식 구문, 특히이 경우 +한정자 를 사용하도록 지시합니다 . -Esed 명령이 없으면 sed 명령이됩니다 sed -e 's/[[:blank:]]\+/\n/g'. ( \+단순한 대신 의 사용에 유의하십시오 +.)

Perl 호환 정규식

Perl 호환 정규식 및 PCRE 지원 sed에 익숙한 사용자는 다음과 같이 \s+최소 하나의 공백 문자 실행을 일치시키는 데 사용하십시오 .

sed -E -e 's/\s+/\n/g' old > new

또는

sed -e 's/\s\+/\n/g' old > new

이 명령은 파일에서 입력을 읽고 old결과를 new현재 디렉토리에 명명 파일에 씁니다 .

최대의 휴대 성, 최대의 견고 함

버전 7 Unix 이후 거의 모든 버전의 sed로 돌아 가면 명령 호출이 좀 더 바로크입니다.

$ echo 'τέχνη βιβλίο γη κήπος' | sed -e 's/[ \t][ \t]*/\
/g'
τέχνη
βιβλίο
γη
κήπος

메모:

  • 여기서 우리는 겸손한 +수량 자의 존재를 가정하지도 않고 단일 공백 ​​또는 탭 ( [ \t])과 0 개 이상 ( )을 사용하여 시뮬레이션합니다 [ \t]*.
  • 마찬가지로, sed가 \n개행을 이해하지 못한다고 가정 하면 명령 행에 그대로 포함해야합니다.
    • \명령의 첫 번째 줄과 끝은 바로 다음 줄 바꿈을 탈출 연속 마커이며, 명령의 나머지는 다음 줄에 있습니다.
      • 참고 : 이스케이프 된 줄 바꿈 앞에 공백이 없어야합니다. 즉, 첫 번째 줄의 끝은 정확히 백 슬래시 뒤에 줄 끝이 와야합니다.
    • 이 오류가 발생하기 쉬운 프로세스는 세계가 보이는 문자로 이동 한 이유를 이해하는 데 도움이되며 복사 및 붙여 넣기로 명령을 시도 할 때주의를 기울여야합니다.

백 슬래시 및 인용에 대한 참고 사항

위의 모든 명령 ''은 큰 따옴표 ( "") 대신 작은 따옴표 ( )를 사용했습니다. 중히 여기다:

$ echo '\\\\' "\\\\"
\\\\ \\

즉, 쉘은 큰 따옴표로 묶인 문자열과 비교하여 작은 따옴표로 묶인 문자열에 다른 이스케이프 규칙을 적용합니다. 일반적으로 작은 따옴표가 있는 정규식에서 일반적인 모든 백 슬래시를 보호하려고 합니다.


이를 수행하는 휴대용 방법은 다음과 같습니다.

sed -e 's/[ \t][ \t]*/\
/g'

백 슬래시와 슬래시 -g 사이의 실제 개행입니다. 많은 sed 구현은에 대해 알지 못 \n하므로 문자 그대로 줄 바꿈이 필요합니다. 줄 바꿈 앞의 백 슬래시는 sed가 줄 바꿈에 대해 화를내는 것을 방지합니다. (sed 스크립트에서 명령은 일반적으로 줄 바꿈으로 종료됩니다)

GNU sed를 사용 \n하면 대체에 사용할 수 있고 정규식에 \ s를 사용할 수 있습니다 .

sed -e 's/\s\s*/\n/g'

GNU sed는 또한 -r 플래그를 지정하면 "확장 된"정규식 (perl 스타일이 아닌 egrep 스타일)을 지원하므로 다음을 사용할 수 있습니다 +.

sed -r -e 's/\s+/\n/g'

If this is for Linux only, you can probably go with the GNU command, but if you want this to work on systems with a non-GNU sed (eg: BSD, Mac OS-X), you might want to go with the more portable option.


All of the examples listed above for sed break on one platform or another. None of them work with the version of sed shipped on Macs.

However, Perl's regex works the same on any machine with Perl installed:

perl -pe 's/\s+/\n/g' file.txt

If you want to save the output:

perl -pe 's/\s+/\n/g' file.txt > newfile.txt

If you want only unique occurrences of words:

perl -pe 's/\s+/\n/g' file.txt | sort -u > newfile.txt

  1. option 1

    echo $(cat testfile)
    
  2. Option 2

    tr ' ' '\n' < testfile
    

This should do the work:

sed -e 's/[ \t]+/\n/g'

[ \t] means a space OR an tab. If you want any kind of space, you could also use \s.

[ \t]+ means as many spaces OR tabs as you want (but at least one)

s/x/y/ means replace the pattern x by y (here \n is a new line)

The g at the end means that you have to repeat as many times it occurs in every line.


You could use POSIX [[:blank:]] to match a horizontal white-space character.

sed 's/[[:blank:]]\+/\n/g' file

or you may use [[:space:]] instead of [[:blank:]] also.

Example:

$ echo 'this  is a sentence' | sed 's/[[:blank:]]\+/\n/g'
this
is
a
sentence

You can also do it with xargs:

cat old | xargs -n1 > new

or

xargs -n1 < old > new

Using gawk:

gawk '{$1=$1}1' OFS="\n" file

참고URL : https://stackoverflow.com/questions/1853009/replace-all-whitespace-with-a-line-break-paragraph-mark-to-make-a-word-list

반응형