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

时间:2017-12-22 09:27:42

标签: linux bash scripting

我想替换输入,

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"

2 个答案:

答案 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)/'