我的文件:
subnet 172.25.10.0 netmask 255.255.255.0 {
option domain-name-servers 172.25.10.9, 8.8.8.8;
default-lease-time 300;
max-lease-time 7500;
range dynamic-bootp 172.25.10.10 172.25.10.30 ;
option broadcast-address 172.25.10.255;
option routers 172.25.10.1;
option ip-forwarding off;
}
对于每个字段,我想要text part
单独的和value part
单独的:(我不知道字段以及每个字段中有多少空格,值也是如此)
正如我们注意到的:
领域:
max-lease-time;(o space)
option domain-name-servers (1 space)
价值观:
300(o space)
172.25.10.10 172.25.10.30 ( 1 space)
我想要的输出是:
我想将值放入以字段命名的变量中:
domain-name-servers="172.25.10.9, 8.8.8.8"(eliminate `option`)
default-lease-time="300"
等等
awk
对我不起作用,因为有些值带有空格:172.25.10.9, 8.8.8.8
我可以使用 达到我的目标grep -o
吗?
答案1
我不认为你可以=
在原文中不存在的地方替换 using grep ;但是,假设您的 grep 版本支持 PCRE 扩展,您可以按如下方式分隔名称-值对
grep -oP '(option |range )?\K(\S+) (.+?(?=;))'
如果你想要替换,你可以使用普通的 perl 代替,例如
perl -pe 's/(option |range )?(\S+) (.+?);/$2="$3"/' file
subnet 172.25.10.0 netmask 255.255.255.0 {
domain-name-servers="172.25.10.9, 8.8.8.8"
default-lease-time="300"
max-lease-time="7500"
dynamic-bootp="172.25.10.10 172.25.10.30 "
broadcast-address="172.25.10.255"
routers="172.25.10.1"
ip-forwarding="off"
}
[你没有具体说明你想要对开头和结尾行做什么,所以我只是将它们保留原样]
或者,或多或少与 sed 等效
sed -E 's/(option |range )?([^[:space:]]{1,}) (.*);/\2="\3"/' file
两者都将表达式分解为 3团体分别由
- 由单个空格组成
options
或后跟一个空格的可选字符串range
- 非空字符的非空序列(后跟一个空格)
- 零个或多个字符(后跟
;
)
=
然后仅用符号并添加双引号替换第二组和第三组。在实际应用程序中,您可能应该尝试使这些表达式更加健壮,例如通过用 POSIX 字符的非零长度序列[[:space:]]
(即空格和/或制表符)替换任何单个空格。
请注意,在所有情况下,都假设只有value
字段可以包含空格;假定字段name
(如default-lease-time
)由非空白字符组成。我认为没有词汇的处理情况的方法两个都字段可以包含任意不带引号的空格。