tr을 사용하여 여러 그룹을 바꾸는 방법은 무엇입니까?

tr을 사용하여 여러 그룹을 바꾸는 방법은 무엇입니까?

tr교체 번호 0-5와 교체 번호를 사용하고 싶습니다 A.6-9B

나는 sed이것을 사용해 보았습니다 :

sed 's/[0-4]/</; s/[6-9]/>/' 

하지만 한 번만 작동하므로 예를 들어 내가 작성 123하면 .A23AAA

답변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 매핑이 즉시 표시되지 않기 때문에 읽기가 쉽지 않습니다.)

반복되는 Bs는 축약될 수 있으며( 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 AAAAAAPOSIX/C 로케일에서만 작동이 보장됩니다.
  • sed 's/[0-5]/A/g'[0-5]012345 이상과 일치할 수 있는 비 POSIX 로케일의 경우에도 마찬가지입니다.

2020년 현재 trGNU 구현과 달리 의 GNU 구현은 sed멀티바이트를 지원하지 않으므로(일부 수준의 지원을 추가하기 위한 일부 패치가 있다고 생각하지만) trGB18030과 같은 문자 세트를 사용하는 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_

관련 정보