
1학년 때는 리눅스를 이용해 선생님이 만든 게임쉘을 터미널에서 배워봤습니다. 단어 사이의 공백을 가로로 제거하고(\n 제외) 문자를 대문자에서 소문자로 변경한 다음 결과를 새 파일로 전송하라는 요청을 받았습니다.
나는 이 명령이 괜찮다고 확신한다. 일단 cat newfile을 사용하여 표시합니다.
이것은 내 명령입니다:
sed -i 's/.*/\U&/' old file | tee newfile
그러나 그것은 받아들이지 않습니다. 왜 작동하지 않나요? 누군가 내가 뭘 잘못하고 있는지 설명해 줄 수 있나요?
답변1
나는 적어도 세 가지를 볼 수 있습니다:
수정
\U
자 변환도착하다대문자로 변환하라는 메시지가 표시되었습니다.~에서대문자에서 소문자로귀하의 표현식이 공백을 전혀 제거하지 않는 것 같습니다. 이는 아마도 또는와 같은 별도의 표현식으로 수행하는 것이 가장 쉽습니다
s/ //g
(더 일반적으로는 가로 공백을 대체하는 것입니다).s/[[:blank:]]//g
명령의 출력을 다른 파일이나 프로세스로 리디렉션하거나 파이프하려는 경우
-i
(또는 )을 사용하는 것은 의미가 없습니다--in-place
.
따라서 이 모든 것을 종합하면 다음을 사용할 수 있습니다.
sed -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile > newfile
oldfile
먼저 내부 수정을 한 다음 리디렉션을 사용하여 콘텐츠를 전송 하려면 newfile
최소한 다음 명령을 사용하여 GNU sed에서 이 작업을 수행할 수 있습니다.
sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' -e 'w /dev/stdout' oldfile | tee newfile
/dev/stdout
이 옵션을 사용할 때 기본적으로 수정된 파일은 표준 출력에 기록되지 않으므로 명시적으로 작성해야 합니다 .-i
또는 (더 쉽게) 수정된 파일을 이동하거나 복사합니다.
sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile && cp oldfile newfile