次のテキストファイルがあるとします。
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
- インデント
- IPアドレス(IPv4またはIPv6)
- 柱を区切る空間
- ホスト名(除く
.ac
) - 末尾のスペース
答え2
でこれを簡単に実行できますawk
。コマンドの問題は、awk
とを使用していることですsed
。ほとんどのawk
。
次の例では、2 番目の列だけが正規表現と一致し、新しいデータを追加して行全体を印刷します。
awk '{ if ( match($2, /(c04c[0-9]+)[.]ac/, arr) ) {
print $0" "arr[1];
} else {
print;
}' < /etc/hosts > newfile
答え3
sed 's/[[:blank:]]\(c04c[0-9]\{1,\}\).*/& \1/'