저는 소문자 및 대문자 내용이있는 temp
파일이 있습니다.
입력
내 temp
파일의 내용 :
hi Jigar GANDHI jiga
모든 위에서 아래로 변환하고 싶습니다. .
명령
다음 명령을 시도했습니다.
sed -e "s/[A-Z]/[a-z]/g" temp
출력이 잘못되었습니다.
출력
원하는 형식 :
hi jigar gandhi jiga
대체 부분에 있어야하는 항목 sed
에 대한 인수 설명?
댓글
- UTF-8 txt 파일을 bash에서 모두 대문자로 변환하는 방법은 무엇입니까?
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 )