sed를 사용하여 다음 텍스트를 변경하고 싶습니다.
(3)www(5)first(3)nth(6)domain(3)com(0)
도착하다:
www.first.nth.domain.com
2~n+3개의 그룹(무한대)이 있다고 가정하면 대괄호 구분 기호 사이의 각 그룹을 캡처한 다음 마침표 구분 기호 순서로 재구성할 수 있습니까? 다른 방법이 있나요?
나는 이미 다음 사항에 익숙합니다.
s/\(\d+\)/./g
그러나 이것은 단지 다음을 생성합니다:
.www.first.nth.domain.com.
답변1
이는 귀하의 요구 사항을 충족하는 것 같습니다. 실행 길이를 확인하기 위해 괄호 안의 숫자를 사용하려는지 확실하지 않지만 그렇지 않다고 가정합니다.
echo '(3)www(5)first(3)nth(6)domain(3)com(0)' |
sed -r -e 's/^\([0-9]+\)//' -e 's/(.)\([0-9]+\)(.)/\1.\2/g' -e 's/\([0-9]+\)$//'
www.first.nth.domain.com
sed
세 가지 다른 RE가 사용됩니다 . 첫 번째와 마지막은 경계가 있는 선행 및 후행 (\d+)
표현식을 제거합니다. 가운데 부분은 나머지 부분을 벗겨 냈습니다.
답변2
어때요 s/\([0-9]+\)/./g; s/^\.|\.$//g
?
\d
일부 sed 구현은 귀하의 구성을 인식하지 못합니다. 위의 내용은 Posix 확장 정규식입니다. 아시다시피,~해야 한다일하다.
비결은 sed
단계별로 수행하는 것입니다. 대괄호 안의 숫자를 바꾸면 대부분의 작업이 완료됩니다. 두 번째 정규식을 사용하여 결과를 정리할 수 있다는 사실을 깨닫지 못했습니다.