5

grep コマンドで正確なアドレスを照合できるように、Unix シェル スクリプト (bash または ksh) で IP アドレスからドットをエスケープしたいと考えています。

echo $ip_addr | sed "s/\./\\\./g"

動作します (出力 1\.2\.3\.4) が、

ip_addr_escaped=`echo $ip_addr | sed "s/\./\\\./g"`
echo $ip_addr_escaped

しない (出力 1.2.3.4)

アドレスを正しくエスケープするにはどうすればよいですか?

編集: 次のように見えます

ip_addr_escaped=`echo $ip_addr | sed "s/\./\\\\\\\./g"`

動作しますが、それは明らかにひどいです!

4

3 に答える 3

12

bashパラメーター展開はパターン置換をサポートします。これは (少し) きれいに見え、への呼び出しを必要としませんsed:

echo ${ip_addr//./\\.}
于 2013-02-21T14:53:28.377 に答える
3

ええ、バックスラッシュの処理は、 backticks の奇妙な引用関連の動作の 1 つです`...`。それと戦うのではなく、単に を使用する方が良いです$(...)。これは、引用ルールがよりスマートで直感的であることを除いて同じです。そう:

ip_addr_escaped=$(echo $ip_addr | sed "s/\./\\\./g")
echo $ip_addr_escaped

しかし、上記が本当に正確なコードである場合 ( という名前のパラメーターがあり、置き換えip_addrたい場合)、Bash の組み込み表記を使用できます。.\.${parameter/pattern/string}

ip_addr_escaped=${ip_addr//./\\.}

というより:

grep "${ip_addr//./\\.}" [FILE...]
于 2013-02-21T14:50:17.247 に答える
2

二重引用符を一重引用符に置き換えます。

于 2013-02-21T14:45:23.300 に答える