sed: 콜론 주위에 공백을 추가하세요

sed: 콜론 주위에 공백을 추가하세요

주위에 공백이 없는 콜론을 찾으면 콜론 앞뒤에 공백을 두는 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. 또한 +가장 가까운 이웃에만 관심이 있으므로 한정자가 필요하지 않습니다 .

관련 정보