假设您有以下文本文件
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
- 缩进
- IP 地址(IPv4 或 IPv6)
- 分隔列的空格
- 主机名(不带
.ac
) - 尾随空格
答案2
您可以在 中轻松完成此操作awk
。您的命令的问题是您同时使用了awk
和sed
。您将丢弃大部分带有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/'