Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash:使用参数展开查找和替换_Linux_Bash_Scripting - Fatal编程技术网

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

Linux Bash:使用参数展开查找和替换,linux,bash,scripting,Linux,Bash,Scripting,我想替换输入 查找字符串:@包括循环进度(38px,30px,#4eb630) 产量, 输出字符串:@包括循环进度(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])”,由我提供 在下面的代码中,当我从文件中读取代码行时,只需打印匹配的行模式,即查找字符串,而我希望打印输出字符串 pattern="

我想替换输入

查找字符串:@包括循环进度(38px,30px,#4eb630)

产量,

输出字符串:@包括循环进度(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])”
,由我提供

在下面的代码中,当我从文件中读取代码行时,只需打印匹配的
模式,即
查找字符串
,而我希望打印输出字符串

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"
pattern=“@include circle progress\([0-9]{1,3}px,){2}#[A-Fa-f0-9]
{3,6}\)“/*regex匹配项查找字符串*/
替换_glob=',#[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?([A-Fa-f0-9]?)-
要替换的字符串中的Fa-f0-9]?([A-Fa-f0-9])“/*全局模式*/
而IFS=''读-r行| |[[-n“$line”];做
如果[[$line=~$pattern]]
然后
回显“${line/$replace_glob/}”
fi
完成<“$1”
您只需使用


参数展开中的模式不是正则表达式,但遵循与全局模式匹配相同的规则:

  • *
    :匹配任何字符序列
  • :匹配任何字符
  • [
    ]
    :集合中的任何字符
  • [^
    ]
    [!
    ]
    :未设置的任何字符
使用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]}"}"

因此,基本上您的要求是从输入字符串中删除部分
#4eb630
,对吗?@是的,这就是我想要的,只使用参数扩展。您不能使用类型为
${source/orig/repl/}
的参数扩展,变量
orig
repl
不能是值,它们只能是字符串。您需要使用
sed
来replacement@Inian如果我在交互模式下执行命令
echo“${source//$replace_glob/}”
,只要一个
source
。它用@include circle progress(38px,30px,30px)替换@include circle progress(38px,30px)。使用
awk
sed
;这是他们创建来处理的任务类型。
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]}"}"