sed: 글자 사이에만 공백을 추가하세요

sed: 글자 사이에만 공백을 추가하세요

숫자나 다른 문자 사이가 아닌 문자 사이에만 공백을 삽입하려고 합니다.

hello woRLd 12ab34되어야 한다h e l l o w o R L d 12a b34

sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/g' file.txt

밝혀지다h el lo w or LD 12a b34

다음 문자도 문자인지 확인하지 않기 때문에 각 문자 뒤에 공백을 삽입할 수 없습니다.

명령을 두 번 실행하면 sed문제가 해결되지만 우아하지는 않습니다. 가능하다면 이 문제를 해결하기 위해 사용해야 합니다 sed.

답변1

루프 + 조건부 분기를 사용하여 수행할 수 있습니다.

$ echo "hello woRLd 12ab34" | sed '
:a
s/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/
ta
'
h e l l o w o R L d 12a b34

또는 더 컴팩트

$ echo "hello woRLd 12ab34" | sed -e :a -e 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/' -e ta
h e l l o w o R L d 12a b34

답변2

명령을 두 번 실행할 필요는 없으며 스크립트에서 대체 명령을 두 번 실행하면 됩니다 sed. 이를 수행하는 우아한 방법이 있습니다. 빈 패턴은 이전 패턴을 반복합니다.ssedsed//

sed 's/\([a-zA-Z]\)\([a-zA-Z]\)/\1 \2/g;s//\1 \2/g' file.txt

가독성을 위해 확장 정규식을 사용하는 것이 좋습니다.

sed -E 's/([a-zA-Z])([a-zA-Z])/\1 \2/g;s//\1 \2/g' file.txt

답변3

다음을 사용하여 정규식이 필요합니다.시야. 안타깝게도sed둘러보기를 지원하지 않습니다.그래서 당신은 사용해야합니다진주

$ echo "hello woRLd 12ab34" | perl -pe 's/([a-zA-Z])(?=[a-zA-Z])/\1 /g'
h e l l o w o R L d 12a b34

$ perl -pe 's/([a-zA-Z])(?=[a-zA-Z])/\1 /g' file.txt
h e l l o w o R L d 12a b34

perl -pne처리해야 할 입력 라인이 여러 개 있고 perl -i -pe파일이 제자리에서 편집된 경우 다음을 사용하세요.

관련 정보