我想替换输入,
find_string:@include circle-progress(38px,30px,#4eb630)
和输出,
Output_string:@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])))'
。
在下面的代码中,当我从文件中读取代码行时,只打印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"
答案 0 :(得分:2)
参数扩展中的模式不是正则表达式,而是遵循与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]}"}"
答案 1 :(得分:0)
您只需使用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)/'