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

如果您只想修改包含两列的行,一列包含 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. 尾随空格

答案2

您可以在 中轻松完成此操作awk。您的命令的问题是您同时使用了awksed。您将丢弃大部分带有awk.

下面的示例仅将第二列与正则表达式匹配并打印整行,并附加新数据:

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/'

相关内容