Linux Bash:使用参数展开查找和替换
我想替换输入 查找字符串:@包括循环进度(38px,30px,#4eb630) 产量, 输出字符串:@包括循环进度(38px,30px) 使用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="
${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”
您只需使用
参数展开中的模式不是正则表达式,但遵循与全局模式匹配相同的规则:
:匹配任何字符序列*
:匹配任何字符?
。[
:集合中的任何字符]
。[^
或]
。[!
:未设置的任何字符]
shopt-s extglob
,可以获得比正则表达式更多的功能
。@(
。|
:匹配任意一次)
。?(
。
。
:匹配任意0或1次)
。*(
。|
:匹配任意0次或更多次)
。!(
:匹配除)
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]}"}"