String 删除变量开头和结尾的子字符串匹配模式

String 删除变量开头和结尾的子字符串匹配模式,string,bash,variables,String,Bash,Variables,正如标题所说,我正在寻找一种方法来删除变量开头和结尾的已定义模式。我知道我必须使用#和%,但我不知道正确的语法 在这种情况下,我想删除开头的http://,以及从file.txt读取的变量$line末尾的/score/,您必须分两步执行: $ string="fooSTUFFfoo" $ string="${string%foo}" $ string="${string#foo}" $ echo "$string" STUFF 嗯,您不能嵌套${var%}/${var#}操作,所以您必须使用临

正如标题所说,我正在寻找一种方法来删除变量开头和结尾的已定义模式。我知道我必须使用
#
%
,但我不知道正确的语法


在这种情况下,我想删除开头的
http://
,以及从
file.txt

读取的变量
$line
末尾的
/score/
,您必须分两步执行:

$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF

嗯,您不能嵌套
${var%}
/
${var#}
操作,所以您必须使用临时变量

就像这里:

var="http://whatever/score/"
temp_var="${var#http://}"
echo "${temp_var%/score/}"
或者,您可以将正则表达式与(例如)sed一起使用:


有一种方法可以只使用内置的bash功能(不运行外部程序,如
sed
)一步完成—使用
bash\u重新匹配

url=http://whatever/score/
re='https?://(.*)/score/'
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
这与
=~
测试右侧的正则表达式匹配,并将组放入
BASH\u REMATCH
数组中


也就是说,使用两个PE表达式和一个临时变量更为常规:

shopt -s extglob
url=http://whatever/score/
val=${url#http?(s)://}; val=${val%/score/}
printf '%s\n' "$val"
…在上面的示例中,
extglob
选项用于允许shell识别“extglobs”——bash对glob语法的扩展(使glob样式模式在功能上类似于正则表达式),其中
?(foo)
意味着
foo
是可选的


顺便说一下,在这些例子中,我使用了<代码> PROTFF <代码>而不是<代码> Engule<代码>,因为许多<代码> Engule<代码>的行为是实现定义的。例如,考虑变量的内容是“代码> -E < /COD>或<代码> -N>代码>的情况。

< P> >

export x='https://www.google.com/keep/score';
var=$(perl -e 'if ( $ENV{x} =~ /(https:\/\/)(.+)(\/score)/ ) { print qq($2);}')

什么样的图案?你能说得更具体一点吗?是的,在这种情况下:开头是http://和结尾是/score/。$行是从一个文件中读取的。TXT您正在寻找的是参数扩展,特别是对于您的情况,
${parameter#word}
${parameter%word}
,我对正则表达式比较熟悉。这很有趣。我知道一点。问题是,如何使用sed生成的输出在另一个命令中使用它。让我们假设开始一个脚本/script.sh$variablemodifiedbysedupped给出了答案,表明sed的输出可以存储在variable中,以便重用。这最终起到了很好的效果。我花了两个小时才弄明白。我相信其他的也可以,但我还是喜欢使用正则表达式。谢谢你,伙计@bobylapointe不要忘记单击复选标记来标记此答案。:)为什么在bash具有与内置正则表达式匹配的正则表达式时使用sed?在我的情况下,字符串可能以“boo”或“foo”开头,也可能不以“boo”或“foo”开头,如果它以其中任何一个开头,我如何在解析中实现or以从字符串开头删除“boo”或“foo”?
shopt -s extglob
url=http://whatever/score/
val=${url#http?(s)://}; val=${val%/score/}
printf '%s\n' "$val"
export x='https://www.google.com/keep/score';
var=$(perl -e 'if ( $ENV{x} =~ /(https:\/\/)(.+)(\/score)/ ) { print qq($2);}')