파일 내용을 소문자로 변환

저는 소문자 및 대문자 내용이있는 temp 파일이 있습니다.

입력

temp 파일의 내용 :

 hi Jigar GANDHI jiga  

모든 위에서 아래로 변환하고 싶습니다. .

명령

다음 명령을 시도했습니다.

sed -e "s/[A-Z]/[a-z]/g" temp 

출력이 잘못되었습니다.

출력

원하는 형식 :

hi jigar gandhi jiga 

대체 부분에 있어야하는 항목 sed에 대한 인수 설명?

댓글

Answer

입력에 ASCII 문자 만 포함 된 경우 다음과 같이 tr를 사용할 수 있습니다.

또는 (기억하기 어렵고 IMO를 입력합니다. 그러나 ASCII 라틴 문자로 제한되지는 않지만 GNU tr를 포함한 일부 구현에서는 여전히 1 바이트 문자로 제한되므로 UTF-8 로케일에서는 여전히 ASCII 문자로 제한됩니다. / p>

tr "[:upper:]" "[:lower:]" < input 

sed를 사용해야하는 경우 :

sed "s/.*/\L&/g" < input 

(여기서는 GNU 구현을 가정합니다).

POSIX sed를 사용하면 모든 음역을 지정해야하며 다음 중 어떤 것을 선택할 수 있습니다. 변환 할 문자 :

sed "y/AǼBCΓDEFGH.../aǽbcγdefgh.../" < input 

awk 포함 :

awk "{print tolower($0)}" < input 

댓글

  • \L는 GNU 확장입니다.
  • \L는 지금까지 저에게 적합합니다. GNU 확장 을 만들려는 요점을 강조하십시오.
  • @JigarGandhi. sed는 Unix 명령입니다. 시스템마다 동작이 다른 변형이 있습니다. d 기능. 고맙게도 오늘날에는 ' 가장 준수하는 표준이 있으므로 모두에게 공통적 인 최소한의 기능 세트를 신뢰할 수 있습니다. \L는 그 중 하나가 아니며 GNU에서 소개 한 sed (표준 ex의 동일한 연산자와 일치합니다. div> / vi)이며 일반적으로 다른 구현에서는 사용할 수 없습니다.
  • GNU와 같은 일부 tr 구현에 유의하세요. tr ' 멀티 바이트 로케일에서 제대로 작동하지 않습니다 (대부분은 요즘에 있습니다. echo STÉPHANE | tr '[:upper:]' '[:lower:]'). GNU 시스템에서는 sed 변형 또는 awk '의

    .

  • 약간 수정 : sed 's/.*/\L&/g' < input. 일치하는 하위 문자열에 대한 \1 참조는 wurtle이하는 것처럼 괄호로 하위 문자열을 지정하지 않는 한 ' 작동하지 않습니다. 그러나 '는 &를 사용하여 전체 일치를 나타내는 데 약간 더 깔끔합니다.

답변

vim을 사용하면 매우 간단합니다.

$ vim filename gg0guGZZ 

열기 gg 파일은 첫 번째 행인 0 첫 번째 열로 이동합니다. guG , 파일의 맨 아래까지 모든 문자의 대소 문자를 줄입니다. ZZ는 저장하고 종료합니다.

당신이 던지는 거의 모든 것을 처리해야합니다. “숫자를 무시합니다.”가 아닌 ASCII를 처리합니다.

반대를 원하면 소문자를 대문자로 바꾸고 u를 바꿉니다. U : gg0gUGZZ 및 설정이 완료되었습니다.

댓글

  • Lol " 매우 간단합니다 "
  • 확실히 그렇지 않습니다. ' 많은 파일에 대해 잘 확장되지 않음
  • @CoreyGoldberg vim file1 file2 fileetc 그런 다음 :bufdo gg0guG:w<CR>와 같은 항목이 아마 여러 파일에 대해 작동합니다. 그래도 테스트하지 않았습니다!
  • @TankorSmash는 여전히 ' 수의 파일로 확장되지 않습니다.

답변

저는 dd를 좋아합니다.

<<\IN LC_ALL=C 2<>/dev/null \ dd conv=lcase hi Jigar GANDHI jiga IN 

… gets …

hi jigar ghandi jiga 

LC_ALL=C는 입력에서 멀티 바이트를 보호하기위한 것입니다. 멀티 바이트 대문자는 변환되지 않습니다. (GNU) tr도 마찬가지입니다. 두 앱 모두 C가 아닌 로케일에서 입력 맹 글링이 발생하기 쉽습니다. iconv는 포괄적 인 솔루션을 위해 둘 중 하나와 결합 될 수 있습니다.

2>/dev/null 리디렉션은 dd “의 기본 상태 보고서와 해당 표준 보고서를 삭제합니다.이 보고서가 없으면 dd는 처리 된 바이트 수 등과 같은 정보를 인쇄하여 위와 같은 작업을 완료합니다.

코멘트

  • 이 솔루션은 대용량 파일을 처리 할 때 tr보다 훨씬 빠릅니다.

답변

Perl 5를 사용할 수도 있습니다.

perl -pe "$_=lc" temp 

-p 옵션은 perl은 입력의 각 행에 대해 지정된 표현식을 한 번 실행하여 결과를 인쇄합니다. 즉, $_의 최종 값입니다. -e는 프로그램은 스크립트를 포함하는 파일이 아닌 다음 인수가됩니다. lc는 소문자로 변환됩니다. 인수가 없으면 $_. 및 $_= 다시 저장하여 인쇄됩니다.

변형은

perl -ne "print lc" temp 

-n$_가 결국 인쇄되지 않는다는 점을 제외하면 -p와 같습니다. 따라서 해당 변수에 저장하는 대신 명시적인 print 문을 포함합니다.

sed와 달리 Perl의 이점 중 하나는 GNU 확장이 필요 없다는 것입니다. GNU가 아닌 환경과 호환되어야하지만 이미 Perl과 종속성이있는 프로젝트가 있습니다. tr와 비교할 때 Perl lc는 로케일을 더 쉽게 인식 할 수 있습니다. 자세한 내용은 perllocale 매뉴얼 페이지를 참조하십시오.

답변

캡처해야합니다. 일치하는 패턴을 수정 한 다음 수정 자로 대체하는 데 사용합니다.

sed "s/\([A-Z]\)/\L\1/g" temp 

\(...\)는 일치하는 텍스트를 포함하면 첫 번째 캡처는 \1, 다음은 \2 등으로 이동합니다. 번호 매기기는 중첩 된 캡처.

\L는 캡처 된 패턴을 소문자로 변환합니다. 또한 대문자를위한 \U도 있습니다. .

댓글

  • 이 작업은 필요하지 않습니다. 전체 패턴은 항상 &에 포함됩니다.
  • 사실이지만 일치 캡처를 설명 할 기회를 놓쳤을 것입니다. 🙂

답변

MvG의 답변 외에도 Perl 6을 사용할 수 있습니다.

perl6 -pe .=lc temp

여기서 $ _는 암시 적이며 쉘에 의한 확장으로부터 보호하기 위해 작은 따옴표가 필요하지 않습니다 ($ _는 특수 Bash 매개 변수 임; 참조 : https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html )

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다