tr
교체 번호 0-5
와 교체 번호를 사용하고 싶습니다 A
.6-9
B
나는 sed
이것을 사용해 보았습니다 :
sed 's/[0-4]/</; s/[6-9]/>/'
하지만 한 번만 작동하므로 예를 들어 내가 작성 123
하면 .A23
AAA
답변1
의 경우 각 줄에서 발생하는 모든 내용을 대체하도록 sed
추가해야 합니다 .g
sed 's/[0-4]/A/g;s/[5-9]/B/g'
를 사용하면 tr
두 개의 s를 연결할 수 있습니다 tr
.
tr '0-4' A | tr '6-9' B
또는 명시적으로 문자 변환을 제공합니다.
tr 0123456789 AAAAABBBBB
심지어:
tr 0-45-9 AAAAABBBBB
(그러나 후자는 1-1 매핑이 즉시 표시되지 않기 때문에 읽기가 쉽지 않습니다.)
반복되는 B
s는 축약될 수 있으며( tr
마지막 문자는 필요에 따라 반복됨) 범위를 병합할 수 있습니다.
tr 0123456789 AAAAAB
tr 0-9 AAAAAB
더 복잡한 대체의 경우 명령을 분할하면 목적을 더 명확하게 만드는 데 도움이 될 수 있습니다.
tr 0123456789 \
AAAAABBBBB
또는 이 경우 참조 범위가 확장 길이와 일치한다는 사실을 활용하십시오.
tr '0-4''5-9' \
AAAAABBBBB
예제의 첫 번째 명령에 표시된 것처럼 균등하게 분할하기 위해 범위 분할이 0-4 및 5-9라고 가정합니다 sed
. 범위는 필요에 따라 조정될 수 있습니다.
답변2
/g
모든 문자에 대해 전역 대체를 수행하려면 끝에 수량자를 사용하십시오. 이것이 없으면 교체는 첫 번째 일치하는 문자에서 끝나고아니요그런 다음 계속하십시오.
sed
문자를 음역하는 또 다른 방법( 과 유사 tr
)은 GNU와 POSIX 모두에서 사용할 수 있습니다.
sed 'y/123456789/AAAAABBBB/'
답변3
POSIX적으로:
tr 0123456789 AAAAAABBBB
tr 0123456789 '[A*6][B*4]'
tr 0123456789 '[A*6][B*]'
sed 's/[012345]/A/g; s/[6789]/B/g'
sed 'y/0123456789/AAAAAABBBB/'
몇 가지 참고사항:
tr 012345 A
두 번째 그룹의 크기가 첫 번째 그룹의 크기와 다르기 때문에 POSIX가 아닙니다.tr 0-5 AAAAAA
POSIX/C 로케일에서만 작동이 보장됩니다.sed 's/[0-5]/A/g'
[0-5]
012345 이상과 일치할 수 있는 비 POSIX 로케일의 경우에도 마찬가지입니다.
2020년 현재 tr
GNU 구현과 달리 의 GNU 구현은 sed
멀티바이트를 지원하지 않으므로(일부 수준의 지원을 추가하기 위한 일부 패치가 있다고 생각하지만) tr
GB18030과 같은 문자 세트를 사용하는 GNU에서는 이러한 메서드를 사용할 수 없습니다. 대부분의 문자 인코딩에 10진수 인코딩이 포함되는 로케일 시스템입니다.
예를 들어:
$ printf '%s\n' "$LANG"
zh_CN.gb18030
$ locale charmap
GB18030
$ locale title
Chinese locale for Peoples Republic of China
$ tr --version
tr (GNU coreutils) 8.30
[...]
$ sed --version
sed (GNU sed) 4.7
[...]
$ echo '£12' | tr 0123456789 '[A*6][B*4]'
丄凙AA
$ echo '£12' | sed 'y/0123456789/AAAAAABBBB/'
£AA
이는 £
(파운드 기호)가 바이트 0x81 0x30 0x84 0x35로 인코딩되기 때문입니다. 여기서 0x30도 인코딩 0
이고 0x35도 인코딩입니다 5
.
$ echo '£12' | LC_ALL=C od -vtx1 -tc
0000000 81 30 84 35 31 32 0a
201 0 204 5 1 2 \n
0000007
$ echo '£12' | tr 0123456789 '[A*6][B*5]' | LC_ALL=C od -vtx1 -tc
0000000 81 41 84 41 41 41 0a
201 A 204 A A A \n
0000007
답변4
범위가 0-4 및 5-9라고 가정합니다.
tr 0-9 AAAAAB
또는
sed y_0123456789_AAAAABBBBB_