두 단계가 있습니다. 먼저 파일에 호스트가 있는지 확인하세요.
파일이 있는 경우:
# 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-
끝에 있는 숫자는 무시하지만 대시(-)는 무시하지 않습니다.-).
부분적으로 작동하는 정규식을 많이 찾았습니다. 다음은 두 가지입니다.
그리고
"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-])'