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:]]
?t
e
s
답변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_