주위에 공백이 없는 콜론을 찾으면 콜론 앞뒤에 공백을 두는 sed 명령을 작성하려고 합니다. 즉, 다음과 같이 abc:def
변환합니다 abc : def
.
echo "abc:def" | sed -e 's/[^\s]\+:[^\s]\+/ : /g'
출력이 여전히 입니다 abc:def
. 어떻게 해야 합니까? 위의 명령에 어떤 문제가 있나요?
답변1
\s
공백 표현 sed
은 이식 가능하지 않습니다. 예를 들어 POSIX 구현에서는 표현식이 일치하지 않습니다(GNU sed, posix 모드).
$ echo "abc:def" | sed --posix -e 's/[^\s]\+:[^\s]\+/ : /g'
abc:def
하지만 당신의 표정이라면했다일치하면 전체 시퀀스를 대체하므로 원하는 작업을 수행하지 않습니다(예: 비-posix 모드의 GNU sed).
$ echo "abc:def" | sed -e 's/[^\s]\+:[^\s]\+/ : /g'
:
아마도 당신이 원하는 것은 예 s/\([^[:blank:]]\):\([^[:blank:]]\)/\1 : \2/
를 들어
$ echo "abc:def" | sed -e 's/\([^[:blank:]]\):\([^[:blank:]]\)/\1 : \2/g'
abc : def
[내가 아는 한, \+
이식성이 없는 반복 연산자는 불필요합니다. ]
답변2
노력하다:
echo "abc:def" | sed 's@\([^\s]\):\([^\s]\)@\1 : \2@g'
나는 이것을 GNU sed로 테스트했지만 이것이 BSD sed의 경우인지 확실하지 않습니다.
원래 일치 항목의 일부를 유지하려면 현재 수행 중인 작업인 캡처 그룹이 \(...\)
필요 \1
합니다 \2
. 또한 +
가장 가까운 이웃에만 관심이 있으므로 한정자가 필요하지 않습니다 .