我想替换输入,
find_string:@include circle-progress(38px,30px,#4eb630)
和输出,
Output_string:@include circle-progress(38px,30px)
使用${find_string//pattern/replacement_string}
模式,我提供的, #[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?([A-Fa-f0-9]?([A-Fa-f0-9]?([A-Fa-f0-9])))'
。
在下面的代码中,当我从文件中读取代码行时,简单地打印line
匹配pattern
,即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]}"}"
你可以简单地使用sed
echo $line | sed 's/\(@include circle-progress([0-9]\{1,3\}px, [0-9]\{1,3\}px\), #[a-fA-F0-9]\{3,6\})/\1)/'