![tr -c '[a-zA-Z]' '\n'은 모든 보완 문자를 바꾸지 않습니다.](https://linux55.com/image/76452/tr%20-c%20'%5Ba-zA-Z%5D'%20'%5Cn'%EC%9D%80%20%EB%AA%A8%EB%93%A0%20%EB%B3%B4%EC%99%84%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EB%B0%94%EA%BE%B8%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
스크립트를 작성할 때 알파([a-zA-Z])를 제외한 모든 문자를 줄바꿈으로 바꾸고 싶습니다. 정의에 따라 -c 플래그(집합의 보수)가 사용될 때 tr은 SET1에 없는 모든 문자를 SET2에 지정된 문자로 바꿔야 합니다. 그러나 예상대로 작동하지 않습니다. 다음을 시도해 보십시오.
echo '[[:lower:]]' | tr -c '[a-zA-Z]' '\n'
내가 얻는 결과는 다음과 같습니다.
[[
lower
]]
보시다시피, 이는 열을 대체하지만 대괄호는 대체하지 않습니다.
누구든지 이것을 명확히 할 수 있습니까?
답변1
tr
이 정규식 스타일의 문자 클래스는 해석되지 않습니다.
[a-zA-Z]
~ 및 [
범위의 문자 집합으로 해석됩니다 .a
z
]
[
따라서 그 보완은 모든 문자 but과 에서 및까지의 문자 범위를 포함하는 문자 세트입니다 .a
z
]
그렇기 때문에 [
교체 ]
되지 않습니다.
알파벳이 아닌 문자를 바꾸려면 a-zA-Z
바꿀 집합의 보수로 지정하면 됩니다.
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%