[英]Bash Replace String in a variable using regex
我正在尝试使用正则表达式替换变量中的字符串。 但是,一旦我使用正则表达式,它就不起作用。
源字符串:
该数字可以是任何数字,任何有效的 integer。
message='"autotermination_minutes": 15,'
预期字符串
message='"autotermination_minutes": 30,'
以下工作(没有正则表达式)
echo ${message/'"autotermination_minutes": 15'/'"autotermination_minutes": 30'}
以下不起作用(使用正则表达式)
echo ${message/'"autotermination_minutes": '[0-9]/'"autotermination_minutes": 30'}
它显示,在 output 之后
"autotermination_minutes": 305,
[0-9]
仅匹配单个数字。
使用[0-9][0-9]
匹配两个:
➜ echo ${message/'"autotermination_minutes": '[0-9][0-9]/'"autotermination_minutes": 30'}
"autotermination_minutes": 30,
请注意,Bash 参数替换的功能非常有限。 你在这里所做的甚至与正则表达式没有任何关系——这些模式只是 glob。 因此,您需要使用+([0-9])
来匹配一个或多个数字,而不是您期望从正则表达式中获得的[0-9]+
:
➜ shopt -s extglob
➜ echo ${message/'"autotermination_minutes": '+([0-9])/'"autotermination_minutes": 30'}
"autotermination_minutes": 15,
另请参见此处。
但你真的应该使用sed
或perl
:
➜ echo "$message" | sed -E 's/[0-9]+/30/'
"autotermination_minutes": 30,
或者,如果您的输入是 JSON,那么您确实应该使用 JSON 解析器并正确读取/写入文件,而不是使用正则表达式。
在纯 bash 中,无法从原始字符串中捕获一个值并使用反向引用将其重新替换。
您可以在此处使用简单的sed
与捕获组和反向引用:
message='"autotermination_minutes": 15,'
sed -E 's/("autotermination_minutes": *)[0-9]+/\130/' <<< "$message"
"autotermination_minutes": 30,
仅 bash 的解决方案怎么样:
message='"autotermination_minutes": 15,'
pattern='(.*autotermination_minutes":[[:blank:]]*)([[:digit:]]+)(.*)'
replacement='30'
if [[ $message =~ $pattern ]]; then
echo "${BASH_REMATCH[1]}${replacement}${BASH_REMATCH[3]}"
else
echo "$message"
fi
请注意,与正确设计sed
或awk
解决方案相比,它在代码大小和执行时间方面的效率较低。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.