"tr"과 같은 문자를 번역하기 위해 "sed"를 사용할 수 있나요?

"tr"과 같은 문자를 번역하기 위해 "sed"를 사용할 수 있나요?

다음과 같이 한 문자 세트를 다른 세트의 해당 문자로 바꾸고 싶습니다.

original set: ots
"target" set: u.x

foobartest → fuubar.ex.

이와 같은 번역/음역은 이 명령의 특징입니다 tr.

$ echo 'foobartest' | tr 'ots' 'u.x'
fuubar.ex.

불행하게도 tr그 자리에서 파일을 변경하는 것은 지원되지 않습니다 sed. 임시 파일 휠을 다시 만들 필요가 없도록 이것을
사용하고 싶습니다 .sed

답변1

sed대부분의 구현에서 최소한 잘 y작동하는 명령을 사용하면 다음과 같습니다.tr

$ echo 'foobartest' | sed 'y/ots/u.x/'
fuubar.ex.

y명령은POSIX sed사양이므로 모든 플랫폼에서 실행되어야 합니다.

그리고 이기 때문에 sed파일을 편집된 버전으로 바꾸도록 할 수 있어 번거로운 임시 파일 비즈니스를 절약할 수 있습니다(구현이 POSIX에서 지정하지 않는 sed해당 옵션을 지원하는 경우).-i

$ sed -i 'y/ots/u.x/' some-file.txt

현재 BSD 구현sed tr일부 특수한 경우에는 실제로 동작을 반영하지 않습니다.

답변2

귀하의 경우와 같이 크기를 변경하지 않고 문자를 음역하려는 경우(GNU와 같은 일부 구현은 tr어쨌든 단일 바이트 문자만 지원함) 다음을 수행할 수 있습니다.

tr 'ots' 'u.x' < file 1<> file

즉, tr파일 자체를 덮어쓰는 것입니다.

sed -i여러 계정보다 낫습니다.

  • 추가 디스크 공간이 필요하지 않습니다(일부 희소 파일, 쓰기 시 복사 특수 사례 제외).
  • inode 번호, 소유권, 권한, ACL 등을 유지합니다.
  • 심볼릭 링크와 잘 작동하며 하드 링크가 끊어지지 않습니다.
  • 종료 시 임시 파일을 남기지 않습니다.

한 가지 단점은 중단되면 파일이 절반만 번역된다는 점입니다. 하지만 이 경우 다시 실행하여 완료할 수 있습니다. 일부 sed구현에서는 명령이 성공하지 않는 한 원본 파일이 변경되지 않은 상태로 유지되도록 하여 이를 적절하게 처리할 수 있습니다.

답변3

대안으로, 주요 문제가 내부에서 파일 변경에 대한 지원이 부족한 것이라면 다음 사항 sponge에 관심이 있을 수 있습니다.더 많은 유틸리티 패키지:

tr 'ots' 'u.x' < file | sponge file

쓰겠습니다만 , 입력이 완료된 후에 file만 쓰기용으로 열립니다 . file~에서맨페이지:

sponge표준 입력을 읽고 지정된 파일에 씁니다. 쉘 리디렉션과 달리 스폰지는 출력 파일을 열기 전에 모든 입력을 흡수합니다. 이를 통해 동일한 파일을 읽고 쓰는 파이프라인을 구축할 수 있습니다.

메모리에 맞지 않는 매우 큰 파일이 없다면 이 방법이 sponge도움이 될 수 있습니다.

관련 정보