我将CSV读入包含以下短语的脚本:
This port supports SSLv3/TLSv1.0.
This port supports TLSv1.0/TLSv1.1/TLSv1.2.
This port supports TLSv1.2.
我要做的是在单词/数字上设置REGEX变量: TLSv1.0 然后在IF / Then语句中引用该变量。问题我是 正在获得正则表达式以查看TLSv1.0。有人能帮助我吗? 制作我的BASH脚本,看看TLSv1.0何时沿着一条以“此端口支持”开头的行?
#!/bin/sh
REGEX="\TLSv1.0\"
cat filename.csv | awk -F"," '{gsub(/\"/,"",$4);print $5}' | sed s/\"//g |
while IFS=" " read pluginoutput
do
if [[ "$pluginoutput" =~ $REGEX ]]; then
.
. rest of my code
.
你可以看到我正在尝试在变量中设置正则表达式,但它只是不起作用。显然是一个错字或什么的。有没有人有正则表达式建议?
谢谢,
答案 0 :(得分:4)
这里有很多错误。选择一些关键的:
#!/bin/sh
指定您希望使用符合POSIX的解释器解释您的脚本,但不指定哪一个。其中许多内容(例如ash
或dash
)不具有[[ ]]
,=~
或您的代码所依赖的其他扩展程序。请改用#!/bin/bash
。在REGEX="\TLSv1.0\"
中,"
是数据,而不是语法。这意味着,当您执行[[ $string =~ $regex ]]
时,它们将成为所搜索内容的一部分。相比之下,regex=TLSv1.0
,regex="TLSv1.0"
或regex='TLSv1.0'
将具有相同的效果,即将TLSv1.0
指定为regex
变量的内容。
那就是说,作为正则表达式语法的一个要点,你可能想要regex='TLSv1[.]0'
- 这样它只会匹配.
,而不是将点视为匹配任意字符的通配符(因为它是正则表达式语法)。
就个人而言,我可能会做更多类似下面的事情(如果我有理由在bash中进行解析而不是让一个egrep
调用处理所有输入):
#!/bin/bash
regex='(^|,)"?This port supports .*TLSv1[.]0.*[.]"?($|,)'
while IFS= read -r line; do
[[ $line =~ $regex ]] && echo "Found TLSv1.0 support"
done