Bash 提供带有子字符串删除的参数扩展,它允许您从前面修剪"substring A",然后从后面修剪"substring B",留下"abc/def/ghi"。例如,您可以这样做:
ssa="substring A" ## substrings to find text between
ssb="substring B"
line="some random text here substring A abc/def/ghi substring B"
text="${line#*${ssa}}" ## trim through $ssa from the front (left)
text="${text%${ssb}*}" ## trim through $ssb from the back (right)
echo $text ## output result
示例输出
abc/def/ghi
从字符串前面修剪和从字符串后面修剪的两种基本形式是:
${var#pattern} # Strip shortest match of pattern from front of $var
${var##pattern} # Strip longest match of pattern from front of $var
${var%pattern} # Strip shortest match of pattern from back of $var
${var%%pattern} # Strip longest match of pattern from back of $var
其中pattern 可以包含通配符,例如'*' 和'?'。如果您有任何其他问题,请仔细查看并告诉我。
使用 BASH_REMATCH
BASH_REMATCH 是一个内部数组,包含匹配[[ text =~ REGEX ]] 的结果。 ${BASH_REMATCH[0]} 是与REGEX 匹配的总文本,然后${BASH_REMATCH[1..2..etc]} 是正则表达式中(...) 之间的正则表达式捕获的匹配部分(您可以提供多个捕获)
使用与上述相同的设置,您可以修改脚本以使用 text 替换参数扩展使用
regex="^.*${ssa} ([^ ]+) ${ssb}.*$" ## REGEX to match with (..) capture
[[ $line =~ $regex ]] && echo ${BASH_REMATCH[1]}
$regex 中的正则表达式将匹配捕获$ssa 和$ssb 之间的整行。完整的修改脚本是:
ssa="substring A" ## substrings to find text between
ssb="substring B"
line="some random text here substring A abc/def/ghi substring B"
regex="^.*${ssa} ([^ ]+) ${ssb}.*$" ## REGEX to match with (..) capture
[[ $line =~ $regex ]] && echo ${BASH_REMATCH[1]}
(相同的输出)
这两种方法在man 1 bash 中都有完整的解释。使用适合您所面临情况的任何一种。我总是发现参数扩展更直观一些(您可以逐步将文本缩减为您需要的任何内容)。然而,扩展正则表达式匹配的强大功能可以为参数扩展提供强大的替代方案。