sed를 사용하여 IPv4 주소의 마지막 옥텟을 변경된 부분으로 전달하는 방법은 무엇입니까?

sed를 사용하여 IPv4 주소의 마지막 옥텟을 변경된 부분으로 전달하는 방법은 무엇입니까?

네트워크를 64개 IP에서 128개 IP로 업그레이드할 계획입니다. 물론 40개가 넘는 모든 VM에서 수동으로 변경하고 싶지는 않습니다. sed -i와 함께 ansible ad-hoc 명령을 사용한 다음 동일한 명령을 사용하여 인터페이스를 다시 시작할 계획입니다. 나는 이것을 시도했지만 주소에서 슬래시를 바꾸는 방법에 대한 해결책을 찾았습니다. 하지만 여전히 IP 주소의 마지막 옥텟을 변수로 출력에 전달해야 합니다. 여기서는 작동하지만 부분적으로만 작동합니다.

원래의:

address 195.23.154.X/26

내가 원하는 것은:

 address 195.34.154.X/25

존재하다/etc/network/interfaces/

이스케이프된 슬래시가 포함된 작업 sed 명령의 일부:

 sed 's/address\ 195.24.153.3\/26/address\ 195.23.154.4\/27/g' interfaces.bak

이 예에서 "3"을 어떻게 보존할 수 있습니까?

답변1

명령 구문의 모든 슬래시를 sed다른 문자로 바꾸고 패턴이나 대체에 슬래시를 유지하십시오.

sed 's#foo/bar#foo/baz#'

또 다른 옵션은 문자열의 모든 슬래시를 이스케이프 처리하는 것입니다.

sed 's/foo\/bar/foo\/baz/'

답변2

실제로 가정해보자필요addressIP 주소의 처음 세 부분이 뒤에 오는 문자열을 명시적으로 일치시킨 후 /26다음에서 서브넷 마스크를 업데이트합니다 /25.

sed 's|\(address 195\.23\.154\.[0-9]*\)/26|\1/25|'

먼저 이를 명령 |의 구분 기호 로 사용합니다 s///. 슬래시를 피할 필요가 없도록 이렇게 합니다. 임의의 단일 문자를 대체 명령에서 구분 기호로 사용할 수 있습니다(개행 문자와 같은 몇 가지 명확한 문자 제외).

그런 다음 주소의 슬래시와 일치하는 문자열의 첫 번째 부분을 캡처합니다 \(...\)(이 위치에서 리터럴 점만 일치시키려면 표현식에서 점을 이스케이프 처리해야 합니다). 그런 다음 역참조를 사용하여 \1명령의 대체 부분 에 삽입할 수 있습니다 .

IP 주소의 마지막 부분도 캡처하여 순진하게 일치시키므로 [0-9]*이 부분은 변경되지 않은 대체 주소로 전송됩니다.

시험:

$ echo 'address 195.23.154.112/26' | sed 's|\(address 195\.23\.154\.[0-9]*\)/26|\1/25|'
address 195.23.154.112/25

관련 정보