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

标签 linux bash scripting

我要替换输入,

查找字符串:@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])))' .

在下面的代码中,当我从文件中读取代码行时,仅打印匹配 patternlinefind_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/

相关文章:

linux - 从文件中解析字符串并设置为变量 - Shell 脚本

c++ - 使用已编译版本的 openCV 时出错

linux - 计算文件中的特定单词

mysql - 将mysql查询输出存储到shell变量中

linux - 在 bash 脚本中加速 dig -x

windows - Powershell 为局部变量设置环境变量

linux - ip_append_data 中的一个问题

linux - 应该如何调用 init_module (在用户空间中)

linux - "cat << EOF"如何在 bash 中工作?

linux - 将进程运行所用的秒数保存在变量中