sed 공간 일치 혼란

sed 공간 일치 혼란
echo ' 1 2     3  '|sed 's/[[:space:]]*/_/g'

_1_2_____3__출력을 보고 싶습니다 . 대신, 나는 그것을 _1_2_3_출력으로 본다. 내가 뭘 잘못했나요? ?

편집하다
나를 혼란스럽게 하는 또 다른 점은 위의 예에서 언급하지 않은 내용인데 그 이유는 다음과 같습니다.

echo ' test1 test2  ' | sed 's/[[:space:]]*/_/g'

이것을 보여주세요:

_t_e_s_t_1_t_e_s_t_2_

and 사이를 일치시키는 방법... [[:space:]]?tes

답변1

를 사용했기 때문에 *0개 이상의 공백과 일치한다는 의미입니다. 따라서 0개 이상의 공백이 밑줄로 대체됩니다 _.

노력하다:

$ echo ' 1 2     3  ' | sed 's/[[:space:]]/_/g'
_1_2_____3__

[[:space:]]탭, 줄 바꿈 및 캐리지 리턴 과도 일치한다는 점을 기억하십시오 .

노트

답변2

이미 답을 알고 계시지만 이렇게 간단한 시나리오에서는 화려할 필요가 없다는 점을 지적하고 싶습니다.

$ echo ' 1 2     3  ' | sed 's/ /_/g'
_1_2_____3__

공백과 탭만 바꾸려면 [ \t] 구조를 사용할 수도 있습니다.

$ echo -e " 1\t2     3  " | sed 's/[ \t]/_/g'
_1_2_____3__

답변3

이 질문은 sed 정규식 구문에 대한 매우 유효한 질문인 sed에 대해 명시적으로 묻습니다.

그러나 근본적인 문제가 _공백을 true로 바꾸는 것이라면, "작업에 적합한 도구"를 사용하여 문자를 번역하는 대체 답변이 있습니다 tr.man tr).

이 명령은 tr abc 123첫 번째 목록의 문자를 두 번째 목록의 해당 문자로 바꿉니다. 따라서 tr ' ' _공백을 밑줄로 바꾸십시오.

$ echo ' 1 2     3  ' | tr ' ' _
_1_2_____3__


귀하의 예와 같은 모든 종류의 공백을 포함하여 보다 일반적인 경우를 보여주기 위해
비교를 위해 일반 공백 문자를 변환한 결과는 다음과 같습니다 ' '.

echo ' 1 2     3  x\ny\tz' | tr ' ' _        
_1_2_____3__x
y       z

_:space: 클래스의 모든 문자를 :: 로 변환할 때의 출력입니다.

echo ' 1 2     3  x\ny\tz' | tr '[:space:]' _
_1_2_____3__x_y_z_

(출력 끝에 개행 문자가 없고 _그 뒤에 하나가 있다는 점에 유의하십시오 z.) 이는 의 축약된 형식인
로 명시적으로 작성할 수 있습니다 .tr ' \t\n' _tr ' \t\n' ___

$ echo ' 1 2     3  x\ny\tz' | tr ' \t\n' _    
_1_2_____3__x_y_z_

관련 정보