"tr" 명령은 어떻게 작동하나요?

"tr" 명령은 어떻게 작동하나요?

놀다 tr가 예상치 못한 결과를 얻었습니다. 이러한 상황에서는 어떤 일이 발생합니까? 뒤에서 무슨 일이 일어나고 있는지 이해하지 못하거나 이 명령을 올바르게 사용하지 않을 수도 있습니다.

예시 A

echo '0123456789' | tr [:digit:] '12'

1222222222

실시예 B1

echo '1111111111' | tr [:digit:] '12'

2222222222

예시 B2

echo '1111111111' | tr '1' '12'

1111111111

실시예 C1

예상대로 작동합니다.

echo '0123456789' | tr '5' 'x'

01234x6789

실시예 C2

나는 이것이 01234xx6789생성될 수 있거나 어떻게든 이러한 모든 예를 설명할 것이라고 기대했습니다. 왜냐하면 원래 문자만 대체될 수 있기 때문입니다(다른 문자는 추가될 수 없습니다).

echo '0123456789' | tr '5' 'xx'

01234x6789

답변1

tr매개변수는 다음과 같습니다.지도문자 수: 문자가 1:1 순서로 매핑됩니다. 대체 세트에서는 필요에 따라 마지막 문자가 반복됩니다. 추가 문자는 무시됩니다.

그러므로

tr 5 x

예상대로 "5"를 "x"로 바꿉니다.

tr 5 xx

또한 "5"를 "x"로 대체합니다. 추가 "x"는 무시됩니다.

tr 1 12

"1"을 "1"로 "바꿉니다". 추가 "2"는 무시됩니다.

tr '[:digit:]' '12'

쉘 확장을 피하기 위해 인용됨(로케일에 따라 다름)

tr 0123456789 122222222

그리고 "0"을 "1"로 바꾸고 "1"을 "9"를 "2"로 바꿉니다.

답변2

IMO 이 동작은macos tr 매뉴얼 페이지:

첫 번째 요약 양식에서는 string1의 문자가 string2의 문자로 변환됩니다. 여기서 string1의 첫 번째 문자는 string2의 첫 번째 문자로 변환됩니다. string1이 string2보다 긴 경우 string2에서 발견된 마지막 문자는 string1이 소진될 때까지 반복됩니다.

관련 정보