如何在BASH中的替换表达式中包含正则表达式匹配?
非工作示例:
#!/bin/bash
name=joshua
echo ${name//[oa]/X\1}
Run Code Online (Sandbox Code Playgroud)
我期望输出jXoshuXa与\1由匹配的字符被替换.
这实际上并不起作用,jX1shuX1而是输出.
nic*_*kl- 28
也许并不像所有地狱那样直观且可以说是模糊不清,但是在完整性的精神中,当我们等待替换的BASH捕获到达时,以下目前是可能的.
#!/bin/bash
name='joshua'
[[ $name =~ ([ao].*)([oa]) ]] && \
echo ${name/$BASH_REMATCH/X${BASH_REMATCH[1]}X${BASH_REMATCH[2]}}
Run Code Online (Sandbox Code Playgroud)
在那个例子中,我们知道我们在寻找什么.更接近匹配所有或全局正则表达式对应物,以下示例将贪婪匹配到没有前缀X的集合的最后一次出现并继续向后直到没有剩余.
$ echo ${BASH_REMATCH[*]}
oshua oshu a
Run Code Online (Sandbox Code Playgroud)
该示例将类似于后面的表达式sed,它假定只关心o和没有X前缀的字符.
两个例子的输出
#/bin/bash
name='joshua'
while [[ $name =~ .*[^X]([oa]) ]]; do
name=${name/$BASH_REMATCH/${BASH_REMATCH:0:-1}X${BASH_REMATCH[1]}}
done
echo $name
Run Code Online (Sandbox Code Playgroud)
的nJoy!
bash> name=joshua
bash> echo $name | sed 's/\([oa]\)/X\1/g'
jXoshuXa
Run Code Online (Sandbox Code Playgroud)