다음과 같이 한 문자 세트를 다른 세트의 해당 문자로 바꾸고 싶습니다.
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
도움이 될 수 있습니다.