sed를 통해 여러 값을 대체하는 정규식 패턴

sed를 통해 여러 값을 대체하는 정규식 패턴

로컬 호스트의 IP 주소를 구문 분석하고 두 번째 옥텟을 다른 값으로 바꿔야 하는 스크립트가 있는데 대체된 값은 현재 값에 따라 다릅니다.

예를 들어 IP가 다음과 같은 경우10.10.100.6, 그러면 내가 필요한 결과는 다음과 같습니다.10.20.100.6, IP가 다음과 같은 경우10.20.100.6, 그러면 내가 필요한 결과는 다음과 같습니다.10.10.100.6

나는 다음을 시도했다:

nmcli con show eno16777984 | grep -E '^ipv4.address' | awk -F"/|[[:space:]]+" '{print $2}' | sed -e 's/^10\.10\./10.20./; s/^10\.20\./10\.10\./'

내가 겪고 있는 문제는 sed명령에 설정된 순서대로 대체가 발생한다는 것입니다. 그래서 결과는 항상10.10....

현재 값이 패턴과 일치하는 경우에만 sed가 값을 바꾸도록 하는 방법이 있습니까?

감사해요!

폴리스티렌이 코드 줄은 여러 위치에서 교체되어 수행되고 이 작업을 수행하는 사람은 제한된 경험/지식을 가지므로 문서에서 복사하여 붙여넣으면 되기 때문에 짧은 한 줄의 코드여야 합니다.

고쳐 쓰다

나는 마침내 다음을 통해 이 작업을 수행하는 방법을 알아냈습니다 awk.

nmcli con show eno16777984 | grep -E '^ipv4.address' | awk -F"/|[[:space:]]+" '{print $2}' | awk -F. '{print $1"."($2 == "10" ? "20" : "10")"."$3"."$4}'

그러나 아래에는 이를 수행하는 방법을 보여주는 훌륭하고 간단한 답변이 있습니다 sed.

답변1

그냥 추가하세요t;.

sed -e 's/^10\.10\./10.20./;t;s/^10\.20\./10\.10\./'

성공하면 끝까지 분기됩니다. 하지만 실제로 이러한 모든 grep, awk, sed를 하나의 awk로 결합해야 합니다.

답변2

두 문자열을 바꾸려면 다시 변경되지 않는 임시 세 번째 문자열을 사용하십시오.

sed -e 's/^10\.10\./10.foo./g; s/^10\.20\./10.10./g; s/^10\.foo\./10.20./g'

답변3

grep파이프를 연결 하거나 여기에 sed입력 awk하거나 awk입력할 필요가 없습니다 awk. awk한 번에 모든 작업을 수행할 수 있습니다.

nmcli con show eno16777984 | 
  awk -F"/|[[:space:]]+" '
    /^ipv4.address/ {
      if ($2 ~ /^10\.10/) {
        sub(/10\.10/,"10.20",$2);
      } else if ($2 ~ /^10\.20/) {
        sub(/10\.20/,"10.10",$2);
      };
    };

    1' 

로 시작하는 줄에서 ipv4.address두 번째 필드가 로 시작하면 10.10으로 바뀌고 10.20, 로 시작하면 10.20으로 대체됩니다 10.10. 수정 여부에 관계없이 모든 줄을 인쇄합니다. (이것은 1awk 단축키입니다. 1은 항상 true로 평가되고 기본 작업은 print입니다. 이 줄은 작동합니다 if true then print the current line.)

관련 정보