전체 단어(IP 주소)를 일치시키려면 "sed"를 사용하십시오.

전체 단어(IP 주소)를 일치시키려면 "sed"를 사용하십시오.

파일에 다음과 같은 선 스타일이 있습니다.

1.2.3.4
1.2.3.4a
1.2.3.45
iaa1.2.3.4ad
11.2.3.4a
a1.2.3.4
1.2.3.4>
<1.2.3.4>
<"1.2.3.4">
1.2.3.4 hostname

모든 IP를 교체하고 싶습니다'1.2.3.4'예를 들어 다른 IP를 사용하세요'9.8.7.6', <>와 ""로 묶이고, ip 앞이나 뒤에 문자가 옵니다.

하지만아니요이것'11.2.3.4' 또는'1.2.3.45'

그래서숫자 1.2.4.6.7.8.9.10은 모두 일치합니다.

참고: "1.2.3.4"는 단지 예시일 뿐이며 유효한 IP라면 무엇이든 가능합니다.

다른 IP로 교체하고 싶습니다 sed.1.2.3.4

명령을 어떻게 작성하는지 모르겠습니다 sed.

sed "s/oldip/newip/g"

나는 정규식에 대해 조금 알고 있지만 이것은 나에게 너무 어려운 것 같습니다.

감사해요.

답변1

유효한 IP가 포함되지 않은 행에 대해 무엇을 하고 싶은지 말하지 않았으므로 그냥 무시하고 싶다고 가정합니다. 그런 다음 해야 할 일은 전체 줄이 1~3개의 숫자로 구성된 세 세트( [0-9]{1,3})와 일치하는지 확인한 다음, 1~3개의 숫자로 구성된 마지막 세트와 일치하는지 확인하는 것입니다. 다음 세 가지 방법이 있습니다.

  • GNU sed

    sed -r 's/^([0-9]{1,3}\.){3}[0-9]{1,3}$/5.6.7.8/' file
    
  • 비 GNU sed

    sed  's/^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$/5.6.7.8/' file
    
  • perl -pe 's/^(\d{1,3}\.){3}\d{1,3}$/5.6.7.8/' file
    

답변2

최신 sed를 사용하면 다음을 수행할 수 있습니다.

sed -e 's/\(^\|[^0-9]\)1\.2\.3\.4\($\|[^0-9]\)/\1NEWIP\2/'

즉, 줄의 시작 부분에 있거나 숫자가 아닌 값 앞에 있으면 해당 값 1.2.3.4으로 바꾸고, 줄의 끝이나 뒤에 있으면 숫자가 아닌 값으로 바꿉니다.NEWIP

확장 정규식을 지원하지 않는 이전 sed 버전의 경우 상황은 더 복잡합니다. 예를 들어 마커 문자를 사용하여 이 작업을 수행할 수 있습니다. 입력에 나타나지 않도록 보장되는 두 개의 문자가 필요합니다. 아래 솔루션에서는 ,및 here 를 사용하고 있지만 :다른 캐릭터, 심지어 제어 캐릭터도 가능합니다.

sed -e 's/\(1\.2\.3\.4\)/,\1:/;s/\([0-9]\),/\1/;s/:\([0-9]\)/\1/;s/,.*:/NEWIP/;s/[,:]//'

먼저 교체하려는 패턴 ,앞뒤에 삽입한 다음 앞에 숫자가 있으면 :제거하고 뒤에 숫자가 있으면 문자열을 대체 문자열로 바꿉니다. 남거나 .​,:,:,:

Perl을 사용하면 부정 예측 어설션 (?!\d)과 부정 예측 어설션을 사용하여 (?<!\d)패턴 앞이나 뒤에 숫자가 없는 경우에만 패턴이 일치하도록 할 수도 있습니다.

perl -pe 's/(?<!\d)1\.2\.3\.4(?!\d)/NEWIP/;'

관련 정보