텍스트 파일을 소문자에서 대문자로 변환하고 새 파일로 저장하는 방법

텍스트 파일을 소문자에서 대문자로 변환하고 새 파일로 저장하는 방법

누군가 텍스트 파일의 모든 소문자를 대문자로 변환한 다음 새 파일로 저장하는 방법을 설명해 주시겠습니까? 내 파일은 NewFile.txt라고 하며 500줄의 임의 문자가 포함되어 있습니다.

답변1

POSIX 도구 상자에는 다음이 있습니다.

<input.txt tr '[:lower:]' '[:upper:]' >output.txt

하지만 참고하세요GNU 구현의 경우 단일 바이트 문자로만 작동합니다.;예를 들어, UTF-8 문자 세트를 사용하는 로케일에서는 발음 구별 부호가 없는 abcdefghijklmnopqrstuvwxyz 문자만 사용할 수 있습니다.

<input.txt awk '{print toupper($0)}' >output.txt

또한 POSIX와 함께 사용할 수 있습니다 awk.

<input.txt dd conv=ucase >output.txt

POSIX도 있지만 ASCII가 아닌 문자를 음역하는 구현은 많지 않습니다.

<input.txt sed 's/.*/\U&/g' > output.txt

GNU 와 함께 작동 sed하지만 sedGNU에서만 작동합니다( \U표준은 아닙니다).

그리고 perl:

<input.txt perl -Mopen=locale -pe '$_=uc' >output.txt

그것은 로케일의 toupper규칙을 사용하지 않으므로 다음과 같은 단어에 더 적합할 수 있습니다.사무실( 한 문자를 세 문자로 변환 FFI1).

uconv, ICU 프로젝트의 프로젝트는 다양한 국제 코너 케이스를 매우 잘 처리해야 하며 입력/출력이 UTF-8(또는 uconv --default-code반환되는 모든 항목)로 인코딩된다고 가정합니다. 다른 입력 및 출력 인코딩을 지정하려면 -f/ --from-code-t/ --to-code옵션을 참조하세요.

<input.txt uconv -x upper >output.txt

vim편집기 에서 파일의 첫 번째 문자에 있는 경우( gg가는 중) gUG파일 끝까지 모든 문자를 대문자로 변환을 입력합니다. 그런 다음 :saveas output.txt출력 파일에 저장하십시오.

또는 any ex또는 vi구현을 사용하십시오(모든 구현이 비ASCII 문자를 처리하는 것은 아니지만): ( :%s/.*/\U&/그리고 :w output.txt편집된 파일을 작성 output.txt하고 :q!현재 수정된 입력 파일을 저장하지 않고 종료합니다).

쉘 포함 zsh:

zmodload zsh/mapfile
mapfile[output.txt]=${(U)mapfile[input.txt]}
# or (csh-style):
mapfile[output.txt]=$mapfile[input.txt]:u

아직 확실하지 않은 경우를 대비해 대문자를 소문자로 변환하려면 다음을 수행하세요.

  • tr: 교환 [:lower:]금액[:upper:]
  • awk: toupper로 변경tolower
  • dd: ucase로 변경lcase
  • GNU sed// ex: 다음 으로 vi변경\U\L
  • perl: uc로 변경 lc.
  • uconv: upper로 변경lower
  • vim: (이것은 트릭 중 하나입니다) gUG로 변경합니다.guG
  • zsh: , 로 (U)변경합니다 .(L):u:l

1 C/POSIX toupper()/ towupper()API는 한 번에 한 문자만 다른 문자로 변환할 수 있으므로 텍스트 대소문자를 변경하는 방법에는 제한이 있습니다. 바라보다https://unicode-org.github.io/icu/userguide/icu/posix.html#case-mappings이것에 대해 그리고 더 많은 것.

답변2

내장 명령만을 사용하는 bash one(ish) 라이너...

f="$(< infile.txt)" ; printf "%s" "${f^^}" > outfile.txt ; unset f

f임시 변수를 내용으로 채웁니다 infile.txt.

f그런 다음 bash 변수 트릭을 사용하여 대문자로 표시하고( ${f^^}) STDOUT을 로 리디렉션하는 동안 STDOUT으로 인쇄합니다 outfile.txt.

경고: "임의성"이 라틴어 및 인쇄 가능한 문자에서 벗어나는 경우 이 문제가 발생할 수 있습니다. 또한 후행 개행 문자도 제거합니다.

의견에 따르면 이것이 더 나을 수 있습니다(더 효율적이며 줄바꿈을 버리지 않음).

readarray f < infile.txt ; printf %s "${f[@]^^}" > outfile.txt ; unset f

답변3

sedGNU(Linux 시스템에서 가장 많이 사용함)를 사용하여 명령줄에서 이 작업을 수행할 수 있습니다.

sed -e 's/\([a-z]\)/\U\1/g' filename >newfilename

설명하다:

sed정규식을 사용하여 문자열 스트림을 다른 것으로 처리할 수 있는 프로그램입니다. 표준 입력 또는 파일의 입력을 받아들이고 표준 출력에 씁니다.

이제 사용된 정규식을 분석해 보겠습니다.

바꾸려면 s/<expression>/<new_expression>/g구문을 사용하여 바꿀 일치하는 텍스트를 찾고 다른 표현식을 사용하여 바꾸는 방법을 나타냅니다. 일치하는 항목을 찾는 데 사용하는 정규식은 ([a-z])(대괄호를 이스케이프하는 백슬래시 무시)입니다. 이 정규 표현식은 소문자를 찾습니다. 표현식을 괄호로 묶으면 나중에 참조할 수 있도록 문자를 저장할 수 있습니다.

그런 다음 대체를 위해 를 사용합니다. \U\1여기서 \U대문자로 변환하고(대문자의 경우 "U") \1정규 표현식을 괄호로 묶어 저장한 문자입니다.


추가 자료:

  • 역참조 및 하위 표현식. 이는 나중에 참조할 수 있도록 일치 항목을 저장하고 다시 참조하는 데 사용하는 대괄호입니다.\1
  • 대문자/소문자 변환. 여기에서 자세한 지침 \U과 변환에 사용할 수 있는 다른 연산자를 찾을 수 있습니다.

답변4

제안된 sed-oneliners(@Stéphane Chazelas, @Kusalananda)는 모두 "s" 하위 명령을 사용하는데, 이는 작업에 가장 적합한 도구가 아닙니다. 하나의 문자 집합을 다른 문자로 변경하려면 "y"를 사용하는 것이 더 쉽고 좋습니다.

sed 'y/abcde/ABCDE/' infile > outfile

첫 번째 문자열에 나타나는 첫 번째 문자를 두 번째 문자열에 있는 첫 번째 문자로 변환하고, 첫 번째 문자열에 나타나는 두 번째 문자를 두 번째 문자열에 있는 두 번째 문자로 변환합니다. 위의 "abcde" 문자열을 원하는 "문자 변환 테이블"로 바꾸면 sed가 처리할 수 있는 모든 문자 세트/인코딩을 사용하여 파일을 변환할 수 있습니다.

관련 정보