给定以下形式的字符串:
variable = "info 1 keyword info 2 keyword info 3 789 info 4 keyword extra text..."
期望输出=";信息4";
我想在bash中编写一个命令,在给定关键字的情况下获取info4,获取该关键字最后一次出现之前的6个字符。我试过用grep和cut工具,但一直没能解决这个问题。
使用bash
>=3.0和正则表达式:
[[ "$variable" =~ .*(.{6}) keyword ]] && echo "${BASH_REMATCH[1]}"
输出:
info4
bash正则表达式运算符的替代方案:
a=${variable% keyword*}
a=${a: -6}
echo "$a"
或者,在POSIX外壳中
a=${variable% keyword*}
a=${a#"${a%??????}"}
echo "$a"
两个版本都假定变量包含关键字。
使用-P
选项的grep
解决方案怎么样:
variable="info 1 keyword info 2 keyword info 3 789 info 4 keyword extra text..."
grep -Po '.{6}(?= keyword(?!.*keyword))' <<< "$variable"
输出:
info 4
正则表达式(?= keyword(?!.*keyword))
是一个前瞻性断言,它与后面不再跟有keyword
的keyword
子字符串的开头相匹配。