ファイルの正確な文字列を一致させ、IPアドレスを更新します。

ファイルの正確な文字列を一致させ、IPアドレスを更新します。

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つあります。

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-])'

関連情報