如何匹配文件中的字符串

如何匹配文件中的字符串

我正在尝试将 Python 中的这段代码复制到 Bash

import re
w = open("filetest.txt")
for item in re.findall(r'STRING:\s*(.+)"', w.read()):
  print item

在 Bash 中,但我不知道它是否正确,这没有返回任何内容。

while read line; do
    if [[ $line =~ r'STRING:\s*(.+)"' ]]; then
        echo $line
    fi
done < filetest.txt

文件测试iso.3.6.1.4.1.25355.3.2.6.3.2.1.11.1.1.1 = STRING: "785c7208dcf0"

输出:785c7208dcf0

答案1

sed -n 's/.*STRING:[[:blank:]]*\(..*\)/\1/p' filetest.txt

您不会在 shell 循环中执行此操作,因为这些循环通常不适合解析文本(请参阅“为什么使用 shell 循环处理文本被认为是不好的做法?”)。

相反,上面的单个命令用于sed匹配正则表达式(这里重写为基本正则表达式而作为 PCRE,Perl 兼容正则表达式)。使用的编辑命令用sed捕获的文本替换匹配的行并将其输出。

其他方式:

awk -F ':[[:blank:]]*' '/STRING/ { print $2 }' filetest.txt

这将文件的每一行视为一条记录,其中字段由:任意数量的空格或制表符分隔。当STRING在一行上找到该模式时,将打印第二个此类字段。

您仍然想用循环来完成它吗bash

while IFS= read -r line; do
    if [[ $line =~ 'STRING:'[[:blank:]]*(.+) ]]; then
        printf '%s\n' "${BASH_REMATCH[1]}"
    fi
done <filetest.txt

BASH_REMATCH数组将包含从比赛中捕获的各个位。正则表达式本身(应该是扩展正则表达式) 不应被引用,除了需要按字面解释的位之外。注意:这是你出错的地方;您引用了正则表达式,但没有查找BASH_REMATCH捕获的数据。您还尝试使用正则表达式确切地就像用 Python 编写表达式一样。bash不是Python。

或者,

while IFS= read -r line; do
    match=$(expr "$line" : '.*STRING:[[:blank:]]*\(..*\)')
    if [ -n "$match" ]; then
        printf '%s\n' "$match"
    fi
done <filetest.txt

给定您在问题中的输入,上面的各种变化都将输出

"785c7208dcf0"

也可以看看:

相关内容