我有一个数值为namespace=(example examples-ixx)
的数组
我需要使用for循环遍历此数组,其中我将example
字符串存储在名为ns的变量中。以下是我将要查看的文件内容。
http://example-service-v2.example-ixx:8080/actuator/info
http://example-service-v2.example:8080/actuator/info
我试过以下组合,但它没有用
grep -w ".$ns" filename
grep -w "\.$ns" filename
fgrep -w ".$ns" filename
fgrep -w "\.$ns" filename
我想grep确切的字符串,当前分配给变量$ ns。不多也不少。有人可以帮我这个。
答案 0 :(得分:0)
根据您的问题,让我们设置一个数组:
declare -a namespace=(
example
example-ixx
)
然后,您可以单步执行数组,为每个元素运行grep
。例如:
for ns in "${namespace[@]}"; do
printf '%s> %s\n' "$ns" "$(grep "\.$ns:" input.txt)"
done
请注意,这并不能防止您的网址列表中出现多个条目。当然,我不知道这是否重要。
或者,您可以从数组内容构建一个正则表达式:
grep -E "\.($(IFS="|$IFS"; printf '%s\n' "${namespace[*]}")):" input.txt
这导致单个输出流而不是每个数组元素处理一行,并且可能因源数组中包含正则表达式特殊字符而变得复杂。
请注意,使用这两种解决方案,我们会根据您问题中的示例输入,在.
和:
中包含我们正在搜索的内容。
答案 1 :(得分:0)
你def display_avatar(user)
if user.avatar.attached?
user.avatar
else
'default.png'
end
end
毁了你的一天。在man-page中,描述了-w选项:
仅选择包含构成整个单词的匹配项的行。测试是匹配的子字符串必须位于行的开头,或者前面是非单词构成字符。
如果您有一个字符串 v2.example:,则点前面的字符是 2 ,这是一个单词字符,因此不匹配。你当然可以写
-w
但这也会捕获 .exampleabc 。
只要您的变量grep -F ".$ns" ....
不包含正则表达式中具有特殊含义的字符,就可以使用
ns
因为grep -E "[.]$ns\\>" ....
匹配单词边界。但是,如果\>
确实包含此类字符,则无效。你可以通过
ns
因为grep -E "[.]\\Q$ns\\E\\>" ....
和\Q
之间的内容是字面上的,但这个解决方案也不完美:如果\E
本身包含这些特殊的转义,那么你会得到有趣的结果。
从技术上讲,人们需要转义ns
内的所有正则表达式字符,但只使用POSIX shell的工具,这是我甚至不会强行让敌人做的事情。如果你真的需要一个适用于一般情况的解决方案,那么使用Perl或Ruby等语言编写的小脚本可能更容易进行grepping,你可以在其中使用内置函数来转义正则表达式。
答案 2 :(得分:0)
我能够使用下面的grep命令解决问题。
grep -P "((?<=^)|(?<=\s))$var(?=(\s|$))"