숫자의 세 번째 문자를 다른 문자로 바꾸는 방법

숫자의 세 번째 문자를 다른 문자로 바꾸는 방법

IPS 매개변수에는 차등 IP 주소가 포함됩니다.

IPS="192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127"

IP 주소의 세 번째 "." 숫자를 ","로 바꾸고 싶습니다.

또는를 통해 sed이를 달성하는 방법은 무엇입니까 awk?

예:

echo $IPS | sed ……..

요청된 출력

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

답변1

셸에서:

IPS='192.9.200.12-14 172.17.200.12-89 12.21.1.10-25 127.0.0.1-127'
echo $(IFS=\ .; printf %s.%s.%s,%s\  $IPS)

산출

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

하지만 더 나은 방법(실제로 배열을 사용할 수 있는 방법)은 배열을 함수로 변환하는 것입니다.

iprng() (IFS=.;for ip do printf %s.%s.%s,%s\\n $ip; done)
iprng $IPS

산출

192.9.200,12-14
172.17.200,12-89
12.21.1,10-25
127.0.0,1-127

또는...

echo $(iprng $IPS) 

산출

192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

보시다시피, awk더 간단하고 다른 실행 파일을 호출하지 않고 수행된다는 점을 제외하면 다른 곳에서 수행된 작업과 본질적으로 동일합니다.

답변2

모든 것을 마지막 점까지 일치시키고 그룹으로 기억하세요.

$ echo $IPS | sed 's/\([^ ]*\)\./\1,/g'
192.9.200,12-14 172.17.200,12-89 12.21.1,10-25 127.0.0,1-127

답변3

IP 주소의 옥텟과 일치하는 첫 번째 및 두 번째 그룹을 캡처하고 범위 앞의 점 대신 쉼표 문자를 사용하여 해당 그룹을 반환합니다.

echo ${IPS}|perl -pe 's!(\d{1,3}\.\d{1,3}\.\d{1,3})\.(\d+-\d+\s+)!$1,$2!g'

Perl을 사용하면 \d"\s"를 사용하여 숫자와 공백을 나타낼 수 있습니다.

답변4

을 사용하면 perl다음을 수행할 수 있습니다.

echo "${IPS}" | perl -pe 's/\./(++$c%3==0)?",":"."/ge'

관련 정보