Bash 正则表达式,匹配两个字符串之间的字符串

Bash 正则表达式,匹配两个字符串之间的字符串

我正在使用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如果开头和.结尾都没有空格,我该如何匹配? (使用正则表达式,而不是从结果字符串中删除字符。我知道如何添加另一个grepcut通过管道,但我确信我可以编辑正则表达式来执行我想要的操作)

答案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删除所有直到newline 并从头开始
  • s/\.$//p如果去掉“.”在行尾打印残留

答案2

要匹配句点,必须将其转义或将其包含在方括号内。要排除初始空格,只需根本不将其添加到正则表达式中(不过,您可能会面临在除空格之外的无效字符之后选择文本的风险)。最后,如果您使用+(即至少一个匹配项)而不是*(零个或多个匹配项)后跟指定的匹配项,则无需多次包含数字选择:

array=nslookup -q=srv SOME_ADDRESS | grep -o '[a-z0-9.-]\+\.$'

请注意,上面的正则表达式将排除大写字符和下划线。如果您需要它们,您可以使用[:alnum:]有效的符号。

array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$'

相关内容