숫자나 다른 문자 사이가 아닌 문자 사이에만 공백을 삽입하려고 합니다.
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
. 이를 수행하는 우아한 방법이 있습니다. 빈 패턴은 이전 패턴을 반복합니다.s
sed
sed
//
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
파일이 제자리에서 편집된 경우 다음을 사용하세요.