繁体   English   中英

Bash 使用正则表达式替换变量中的字符串

[英]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,

另请参见此处

但你真的应该使用sedperl

➜ 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

请注意,与正确设计sedawk解决方案相比,它在代码大小和执行时间方面的效率较低。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM