我要替换输入,
查找字符串:@include circle-progress(38px, 30px, #4eb630)
和输出,
输出字符串:@include circle-progress(38px, 30px)
使用 ${find_string//pattern/replacement_string}
其中 pattern 是 , , #[A-Fa-f0-9][A-Fa-f0-9][A-我提供的 Fa-f0-9]?([A-Fa-f0-9]?([A-Fa-f0-9]?([A-Fa-f0-9])))'
.
在下面的代码中,当我从文件中读取代码行时,仅打印匹配 pattern
的 line
即 find_string
,而我想要打印 output_string。
pattern="@include circle-progress\(([0-9]{1,3}px, ){2}#[A-Fa-f0-9]
{3,6}\)" /*regex the matches find_string*/
replace_glob=', #[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?([A-Fa-f0-9]?([A-
Fa-f0-9]?([A-Fa-f0-9])))' /*glob pattern in the string to be replaced*/
while IFS='' read -r line || [[ -n "$line" ]]; do
if [[ $line =~ $pattern ]]
then
echo "${line//$replace_glob/}"
fi
done < "$1"
最佳答案
参数扩展中的模式不是正则表达式,但遵循与 glob 模式匹配相同的规则:
*
:匹配任何字符序列?
:匹配任意字符[
..]
: 集合中的任意字符[^
..]
或[!
..]
:任何不在集合中的字符<
使用 shell 选项:shopt -s extglob
,一些更多的功能,但不如正则表达式
@(
..|
..)
:匹配任意一次?(
..|
..)
:匹配任意0次或1次*(
..|
..)
:匹配任意0次或多次!(
..)
:匹配除 以外的所有内容
但是 bash 支持一些基本的正则表达式,下面应该可以工作:
string='@include circle-progress(38px, 30px, #4eb630)'
pattern='@include circle-progress\([ ]*[0-9]{1,3}px,[ ]*[0-9]{1,3}px(,[ ]*#[A-Fa-f0-9]{3,6}[ ]*)\)'
[[ $string =~ $pattern ]] && echo "${string//"${BASH_REMATCH[1]}"}"
关于linux - Bash:使用参数扩展查找和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47938983/