sed가 DNS 로그 문자열 형식을 변경합니다.

sed가 DNS 로그 문자열 형식을 변경합니다.

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단계별로 수행하는 것입니다. 대괄호 안의 숫자를 바꾸면 대부분의 작업이 완료됩니다. 두 번째 정규식을 사용하여 결과를 정리할 수 있다는 사실을 깨닫지 못했습니다.

관련 정보