파일 내용을 소문자로 변환


85

내가 가진 temp일부 소문자와 대문자 내용으로 파일.

입력

temp파일의 내용 :

hi
Jigar
GANDHI
jiga

모든 upper를 lower 로 변환하고 싶습니다 .

명령

나는 다음 명령을 시도했다 :

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

그러나 출력이 잘못되었습니다.

산출

나는 그것을 원한다.

hi
jigar
gandhi
jiga

에 대한 논쟁 의 대체 부분에 무엇이 필요 sed합니까?


답변:


122

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

tr A-Z a-z < input 

또는 (쉽게 기억하고 IMO를 입력하십시오. 그러나 ASCII 라틴 문자로 제한되지는 않지만 GNU를 포함한 일부 구현 tr에서는 여전히 1 바이트 문자로 제한되므로 UTF-8 로켈에서는 여전히 ASCII 문자로 제한됩니다) :

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

3
그주의 사항 \LGNU 확장이다.
Anthon

\L지금까지 나를 위해 잘 작동합니다. GNU 확장
밝히십시오

2
@JigarGandhi. sed유닉스 명령입니다. 시스템마다 동작 및 기능이 다른 변형이 있습니다. 고맙게도 요즘에는 가장 적합한 표준이 있으므로 모든 사람에게 공통적 인 최소 기능 세트를 신뢰할 수 있습니다. \L은 그들 중 하나가 아니며 GNU에 의해 도입되었으며 sed(표준 ex/ 에서 동일한 연산자와 일치 vi) 다른 구현에서는 일반적으로 사용할 수 없습니다.
Stéphane Chazelas

9
trGNU와 같은 일부 구현 tr은 멀티 바이트 로케일에서 제대로 작동하지 않습니다 (대부분 요즘은 시도해보십시오 echo STÉPHANE | tr '[:upper:]' '[:lower:]'). GNU 시스템에서, 당신은 선호 할 수도 sed변형 또는 awk'들 tolower().
Stéphane Chazelas

5
약간의 보정 : sed 's/.*/\L&/g' < input. \1wurtle 그의에서와 같이 괄호로 문자열을 지정하지 않으면 일치하는 하위 문자열을 참조 작동하지 않습니다. 그러나 &그림과 같이 전체 경기를 나타내는 데 사용 하는 것이 약간 더 깨끗합니다.
Edward Brown

30

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

$ vim filename
gg0guGZZ

파일을 gg열고 0첫 번째 줄인 첫 번째 열로갑니다. 을 사용 guG하면 파일 맨 아래까지 모든 문자의 대소 문자를 낮 춥니 다. ZZ저장하고 종료합니다.

그것은 당신이 던지는 모든 것을 처리해야합니다. 숫자를 무시하고 ASCII가 아닌 것을 처리합니다.

반대로하고 싶을 때는 소문자를 대문자로 바꾸고 : u를 바꾸십시오 U: gg0gUGZZ설정되었습니다.


14
롤 "슈퍼 간단"
blambert

이것은 분명히 많은 파일에 대한 확장 성이 좋지 않습니다
코리 골드버그에게

지금까지 가장 좋아하는 답변 !!!!
Mona Jalal

1
@CoreyGoldberg vim file1 file2 fileetc그리고 아마도 많은 파일에서 작동 :bufdo gg0guG:w<CR>할 것 입니다 . 그래도 테스트하지 않았습니다!
TankorSmash

여전히 많은 파일로 확장되지 않는 @TankorSmash
Corey Goldberg

17

나는 이것을 좋아 dd한다.

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

... 가져옵니다 ...

hi
jigar
ghandi
jiga

LC_ALL=C입력의 모든 멀티 바이트를 보호하는 것입니다 - 어떤 멀티 바이트 자본은 변환되지 않습니다하지만. (GNU) 의 경우도 마찬가지입니다. tr두 앱 모두 C가 아닌 로캘에서 입력 조작이 발생하기 쉽습니다. iconv포괄적 인 솔루션을 위해 둘 중 하나와 결합 될 수 있습니다.

2>/dev/null리디렉션 파기 dd의 기본 상태 보고서 -과 표준 에러. 그렇지 않으면 dd처리 된 바이트 수 등과 같은 정보를 인쇄하는 위와 같은 작업이 완료됩니다.


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

13

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

perl -pe '$_=lc' temp

이 옵션 -p은 perl에게 각 입력 행에 대해 지정된 표현식을 한 번 실행하여 결과, 즉 최종 값을 인쇄하도록 지시합니다 $_. -e스크립트를 포함하는 파일과 달리 프로그램이 다음 인수가 될 것임을 나타냅니다. lc소문자로 변환합니다. 인수가 없으면에 작동합니다 $_. 그리고 $_=이 인쇄되는 있도록 다시 저장합니다.

그것의 변형은

perl -ne 'print lc' temp

결국에는 인쇄되지 않는 것을 제외하고 -n는 사용 하는 것과 같습니다 . 따라서 해당 변수에 저장하는 대신 명시적인 print 문을 포함시킵니다.-p$_

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


9

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

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

\(...\)클로징 유사한 텍스트, 제 캡처 진행 "캡처" \1에 다음 \2중첩 캡처시 브래킷 개방에 따라 넘버링되는 등.

\L캡처 된 패턴을 소문자로 변환도 거기에 \U대문자를 위해.


3
이 작업을 수행 할 필요가 없습니다. 전체 패턴이 항상 포착됩니다.&
mikeserv

사실, 그러나 나는 캡처 경기를 설명하는 기회를 놓쳤을 것입니다 :-)
wurtel

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.