놀다 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이 소진될 때까지 반복됩니다.