【问题标题】:BASH script to match a word using REGEX使用 REGEX 匹配单词的 BASH 脚本
【发布时间】:2017-02-22 18:11:56
【问题描述】:

我有一个 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
.

您可以看到我正在尝试在变量中设置正则表达式,但它不起作用。显然是错字什么的。有人有正则表达式建议吗?

谢谢,

【问题讨论】:

  • 文字引号是怎么回事?你告诉 shell 寻找 "s within 正在搜索的字符串,但它们显然没有出现..
  • 另外,#!/bin/sh 是 POSIX sh,而不是 bash。如果您想要 bash 功能,请使用 bash:#!/bin/bash
  • 另外,cat filename | awk ... 的效率低于awk ... <filenameawk ... filename
  • 您有语法错误。 REGEX="\TLSv1.0\" 应该是 REGEX=\"TLSv1.0\"
  • 这些其他问题有很多原因,但这并不是我想要回答的真正核心。我正在尝试在变量中确定正确的正则表达式语法,以便在正在处理的文档中找到单词 TLSv1.0。

标签: regex bash csv


【解决方案1】:

这里有很多问题。挑选一些关键的:

  • #!/bin/sh 指定您希望使用符合 POSIX 的解释器来解释您的脚本,但没有指定哪一个。其中许多,如ashdash,没有[[ ]]=~ 或您的代码所依赖的其他扩展。请改用#!/bin/bash
  • REGEX="\TLSv1.0\" 中,"s 是数据,而不是语法。这意味着当您执行[[ $string =~ $regex ]] 时,它们是正在搜索的内容的一部分。相比之下,regex=TLSv1.0regex="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

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多