/etc/hostsファイルのパターンに一致する各行の末尾に.comを追加したいと思います。
サンプルファイルの内容:
127.0.0.1 localhost
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz.
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz.
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz.
私はそれが次のように見えるようにしたいです:
127.0.0.1 localhost localhost.com
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz. hostname1.xyz.com
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz. hostname2.xyz.com
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz. hostname3.xyz.com
この効果を得るためのsed
コマンドはありますか?awk
答え1
そしてawk
:
$ awk '$0 = $0 " " $NF ($NF ~ /\.$/ ? "" : ".") "com"' <file
127.0.0.1 localhost localhost.com
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz. hostname1.xyz.com
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz. hostname2.xyz.com
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz. hostname3.xyz.com
答え2
内部編集にPerlを使用するソリューション
perl -i -pe 's/(\s\S+?)(\.?)\s*$/$1$2$1.com\n/' /etc/hosts
\s
スペース文字の一致\S+?
貪欲ではない一致は、空白ではなく1文字以上の文字と一致します。\.?
Greedyは0回または1回一致します。文字(行末に可能な追加。を処理するため)\s*$
行末のすべての空白文字と一致します。$1$2
末尾の空白文字を除く最後の列を保持$1.com\n
.com と改行文字を追加
ソースファイル(/etc/hosts.bkp)をバックアップするように-i
変更します。-i.bkp
sed
注:BRE / EREは非欲張りな一致をサポートしていないため、この正規表現は機能しません。