我正在尝试将 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"
也可以看看: