我正在寻找一种能够在Bash脚本中解析字符串的方法。这是测试字符串:
test="+----------+ | count(4) | +----------+ | 0 | +----------+"
我试着用Sed这样做:
echo $(echo $test | sed -r 's/|s(d+)s|/1/')
这将返回整个测试字符串。
使用原始Bash脚本:
pattern='|s(d+)s|'
if [[ "$test" =~ $pattern ]]
then
echo "${BASH_REMATCH[1]}"
fi
这不会返回任何内容。
我做错了什么?如何做到这一点?
您需要将整个字符串与正则表达式模式匹配,将-n
选项与p
标志一起使用,并使用[0-9]
/[[:digit:]]
来匹配数字,因为POSIX正则表达式不支持d
简写:
sed -rn 's/.*s([0-9]+)s.*|/1/p' <<< "$s"
如果sed
不支持s
,请改用[[:space:]]
/[[:blank:]]
POSIX字符类。
这里,
n
-抑制默认行输出.*
-匹配任何零个或多个字符s
/[[:space:]]
-空白([0-9]+)
-捕获与一个或多个数字匹配的组s
/[[:space:]]
-空白.*
-任意零个或多个字符1
-将整个匹配替换为组1的内容p
-打印替换的结果
请参阅联机sed
演示。
您拥有的Bash代码包含两个问题:管道字符在POSIXERE标准中是特殊的(默认情况下在Bash中使用(,您需要对它们进行转义以匹配为文本管道字符。此外,您需要将d
更改为[[:digit:]]
或[0-9]
:
pattern='|s([0-9]+)s|'
查看Bash在线演示。同样,如果不支持s
,请使用[[:space:]]
。