Bash:使用参数扩展查找和替换

问题描述 投票:2回答:2

我想替换输入,

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"
linux bash scripting
2个回答
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]}"}"

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)/'
© www.soinside.com 2019 - 2024. All rights reserved.