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'