我正在使用nslookup -q=srv SOME_ADDRESS
, 并希望将返回的地址存储在数组中。nslookup
返回:
Server: 123.456.789.123
Address: 123.456.789.123#12
SOME_ADDRESS service = 0 0 1234 address-1.i.want.
SOME_ADDRESS service = 0 0 1234 address-2.i.want.
SOME_ADDRESS service = 0 0 1234 address-3.i.want.
我仍在学习正则表达式,我将字符串放入数组中:
array=($(nslookup -q=srv SOME_ADDRESS | grep -o ' [a-z0-9.-]*[a-z0-9].$'))
这给了我空白的地方[ ]address-3.i.want.
。[ ]
adress-3.i.want
如果开头和.
结尾都没有空格,我该如何匹配? (使用正则表达式,而不是从结果字符串中删除字符。我知道如何添加另一个grep
或cut
通过管道,但我确信我可以编辑正则表达式来执行我想要的操作)
答案1
任务可以由 GNU 完成sed
nslookup -q=srv "${SOME_ADDRESS}" |
sed -n '/\.$/s///;T;/.* /s///p' |
mapfile -t array
在sed
-n
默认不打印行/\.$/s///
消除 ”。”在行尾T
转到结束(意味着如果上面的操作没有发生,则不打印任何内容)/.* /s///p
删除所有内容,直到保留打印内容
或非 GNU
sed -n '/ /s//\n/;/\n/D;s/\.$//p'
/ /s//\n/
n
用ewline代替/\n/D
删除所有直到n
ewline 并从头开始s/\.$//p
如果去掉“.”在行尾打印残留
答案2
要匹配句点,必须将其转义或将其包含在方括号内。要排除初始空格,只需根本不将其添加到正则表达式中(不过,您可能会面临在除空格之外的无效字符之后选择文本的风险)。最后,如果您使用+
(即至少一个匹配项)而不是*
(零个或多个匹配项)后跟指定的匹配项,则无需多次包含数字选择:
array=nslookup -q=srv SOME_ADDRESS | grep -o '[a-z0-9.-]\+\.$'
请注意,上面的正则表达式将排除大写字符和下划线。如果您需要它们,您可以使用[:alnum:]
有效的符号。
array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$'