파일의 정확한 문자열을 일치시키고 IP 주소를 업데이트하십시오.

파일의 정확한 문자열을 일치시키고 IP 주소를 업데이트하십시오.

두 단계가 있습니다. 먼저 파일에 호스트가 있는지 확인하세요.

파일이 있는 경우:

# FILE: /etc/hosts:
192.168.0.10 srv-db srv-db-home
192.168.0.15 srv-db1
192.168.0.20 srv-db-2
192.168.0.20 srv-db-work srv-db-

다음을 실행합니다:

sed -n -e '/\<srv-db\>/p' /etc/hosts

결과는 다음과 같습니다.

192.168.0.10 srv-db
192.168.0.20 srv-db-2
192.168.0.20 srv-db-

끝에 있는 숫자는 무시하지만 대시(-)는 무시하지 않습니다.-).

부분적으로 작동하는 정규식을 많이 찾았습니다. 다음은 두 가지입니다.

grep을 사용하여 정확한 문자열 일치

그리고

"sed"를 사용하여 정확한 문자열을 일치시키는 방법은 무엇입니까? 그러나 그것의 일부는 아닙니다.

@steeldriver의 다음 답변이 도움이 됩니다.

awk '$NF == "srv-db"' /etc/hosts

그러나 IP 주소를 업데이트할 때 내용이 흐려집니다. 제가 생각해낸 전체 코드는 다음과 같습니다.

sed -i -e "s/\(^ *[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\(\s*\)\<srv-db\>/192.168.9.9\2/" /etc/hosts

첫 번째 행만 업데이트해야 하지만 위와 동일한 결과가 업데이트됩니다.

하지만 이 특별한 경우에는 어떤 방법도 완벽하게 작동하지 않았습니다.

답변1

단어 \>경계 앵커는 -경계로 간주됩니다.

후행 공백이 없다는 것을 알고 있는 경우 줄 끝에 고정할 수 있습니다. /\<srv-db$/후행 공백을 허용하려면 이를 수정 /\<srv-db[[:blank:]]*$/하거나/\<srv-db[[:space:]]*$/

아니면 사용 awk해서 만들어 보세요.대신 일치:

awk '$NF == "srv-db"' /etc/hosts

줄 끝에 고정할 필요가 없는 경우(후행 공백이 있더라도) 공백이나 줄 끝(예: "하이픈 없는 단어 경계")을 테스트하는 표현식을 구성해야 합니다. , 예를 들어 (확장 정규식모델)

sed -En -e '/\<srv-db(\s|$)/p'

Perl(또는 PCRE 모드에서는 grep)에 액세스할 수 있다면 아마도 더 우아한 옵션이 있을 것입니다.

perl -ne 'print if /\bsrv-db(?![\w-])/'

또는

grep -P '\bsrv-db(?![\w-])'

관련 정보