Bash 使用正则表达式从URL提取前三个元素

Bash 使用正则表达式从URL提取前三个元素,bash,shell,awk,sed,Bash,Shell,Awk,Sed,给定以下URL: http://www.example.com/path1/path2/page 有没有一种简单的方法可以用正则表达式提取它的前三个块,即: http://www.example.com/path1/path2 我已经找到了一些如何使用一些编码(perl/javascript)的示例,但是如果有人给我指出一个使用正则表达式的sed/awk示例,我会非常感激。 感谢解决方案1:具有简单的参数扩展 echo "${val%/*}" 第二种解决方案:使用awk echo "$va


给定以下URL:

http://www.example.com/path1/path2/page
有没有一种简单的方法可以用正则表达式提取它的前三个块,即:

http://www.example.com/path1/path2
我已经找到了一些如何使用一些编码(perl/javascript)的示例,但是如果有人给我指出一个使用正则表达式的sed/awk示例,我会非常感激。 感谢解决方案1:

具有简单的参数扩展

echo "${val%/*}"
第二种解决方案:使用
awk

echo "$val"  | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH-1)}'
 echo "$val" | awk -F"/" 'NF--;1'  OFS="/"
解决方案3:再加一个
awk

echo "$val"  | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH-1)}'
 echo "$val" | awk -F"/" 'NF--;1'  OFS="/"
解决方案4:使用
sed

echo "$val" | sed 's/\(.*\/\).*/\1/;s/\/$//'
解决方案1:具有简单的参数扩展

echo "${val%/*}"
第二种解决方案:使用
awk

echo "$val"  | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH-1)}'
 echo "$val" | awk -F"/" 'NF--;1'  OFS="/"
解决方案3:再加一个
awk

echo "$val"  | awk 'match($0,/.*\//){print substr($0,RSTART,RLENGTH-1)}'
 echo "$val" | awk -F"/" 'NF--;1'  OFS="/"
解决方案4:使用
sed

echo "$val" | sed 's/\(.*\/\).*/\1/;s/\/$//'
要使用Bash regex使用正则表达式提取它的前三个块(与例如remove last块相反),请执行以下操作:

$ [[ "$var" =~ ^(https?://)?([^/]+/){0,3} ]] && echo $BASH_REMATCH
http://www.example.com/path1/path2/
解释:

  • ^(https?:/)?
    不用担心
  • ([^/]+/){0,3}
    0到3个与输出匹配的块
例如,它支持:

$ var=https://www.example.com/path1/path2/page
https://www.example.com/path1/path2/

$ var=www.example.com/path1/path2/page
www.example.com/path1/path2/

$ var=www.example.com/path1/
www.example.com/path1/
要使用Bash regex使用正则表达式提取它的前三个块(与例如remove last块相反),请执行以下操作:

$ [[ "$var" =~ ^(https?://)?([^/]+/){0,3} ]] && echo $BASH_REMATCH
http://www.example.com/path1/path2/
解释:

  • ^(https?:/)?
    不用担心
  • ([^/]+/){0,3}
    0到3个与输出匹配的块
例如,它支持:

$ var=https://www.example.com/path1/path2/page
https://www.example.com/path1/path2/

$ var=www.example.com/path1/path2/page
www.example.com/path1/path2/

$ var=www.example.com/path1/
www.example.com/path1/

因为我需要将它们插入一个循环中,所以解2、3和4是完美的。我都测试过了。它们都可以工作,除了解决方案3为URL返回两个实例。非常感谢@卡拉,很高兴它帮助了你,干杯,继续学习和分享。因为我需要将它们插入一个循环中,解决方案2、3和4是完美的。我都测试过了。它们都可以工作,除了解决方案3为URL返回两个实例。非常感谢@卡拉,很高兴它帮助了你,干杯,继续学习和分享。