2つのステップがあります。まず、ファイルにホストがあることを確認してください。
ファイルがある場合:
# 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-
末尾の数字は無視しますが、ダッシュ(-)は無視しません。-)。
部分的に動作する正規表現がたくさん見つかりました。以下は2つあります。
そして
「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-])'