sed - 文字列を見つけて追加

sed - 文字列を見つけて追加

次のテキストファイルがあるとします。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.5.213 c04c0.ac
10.0.5.213 c04c1.ac 
10.0.5.213 c04c2.ac 
10.0.5.213 c04c3.ac
10.0.5.213 c04c4.ac
10.0.5.213 c04c5.ac
10.0.5.213 c04c6.ac
10.0.5.213 c04c7.ac
10.0.5.213 c04c8.ac
....

これをどのように変更しますか?

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.5.213 c04c0.ac c04c0
10.0.5.213 c04c1.ac c04c1
10.0.5.213 c04c2.ac c04c2
10.0.5.213 c04c3.ac c04c3 
10.0.5.213 c04c4.ac c04c4
10.0.5.213 c04c5.ac c04c5
10.0.5.213 c04c6.ac c04c6
10.0.5.213 c04c7.ac c04c7
10.0.5.213 c04c8.ac c04c8
....

ホスト名から「.ac」を削除しました。しかし、なぜ「localhost」が正規表現によって削除されないのかわかりません。 c04cxのみを収集して行の末尾に追加するように正規表現を変更するにはどうすればよいですか?

cat /etc/hosts | awk '{print $2}'| sed -r 's/(c04c)([0-9]+)(.*)/\1\2/'

localhost
localhost
c04c0
c04c1
c04c2
c04c3
c04c4
c04c5
c04c6
c04c7
c04c8

ベストアンサー1

2つの列(IPアドレスを含む列と名前で終わる列)を含む行のみを変更するには、これと一致.acする正規表現を使用します。正規表現がコメント化された行と一致しないことを確認することをお勧めします。

sed -e 's/^\([\t ]*\)\([0-9a-fA-F.:][0-9a-fA-F.:]*\)\([\t ][\t ]*\)\([^\t ][^\t ]*\)\.ac\([\t ]*\)/\1\2\3\4.ac \4/'
             111111    222222222222222222222222222    33333333333    4444444444444        555555
  1. インデント
  2. IPアドレス(IPv4またはIPv6)
  3. 柱を区切る空間
  4. ホスト名(除く.ac
  5. 末尾のスペース

おすすめ記事