给定一个由单个空格分隔的路径列表:
/home/me/src/test /home/me/src/vendor/a /home/me/src/vendor/b
我想删除前缀/home/me/src/
,这样结果是:
test vendor/a vendor/b
对于单个路径,我会这样做:${PATH#/home/me/src/}
,但我如何将其应用于该系列?
您可以使用//
来替换所有出现的子字符串。将其替换为空字符串以删除它们。
$ path="/home/me/src/test /home/me/src/vendor/a /home/me/src/vendor/b"
$ echo ${path///home/me/src/}
test vendor/a vendor/b
参考:Bash参考手册中的${parameter/patters/string}
使用shell参数扩展似乎不是解决这个问题的方法,因为它可以删除给定点之前/之后的所有内容是有用的,正如nu11p01n73R的答案所揭示的那样。
为了清楚起见,我将使用sed
和语法sed 's#pattern#replacement#g'
:
$ str="/home/me/src/test /home/me/src/vendor/a /home/me/src/vendor/b"
$ sed 's#/home/me/src/##g' <<< "$str"
test vendor/a vendor/b
就像我这边的grep解决方案一样:
echo 'your string' | grep -Po '^/([^ /]*/)+K.+'
请注意,上面的正则表达式对任何像/x/y/z/test ..
这样的字符串都是这样做的。但如果您只对更换/home/me/src/
感兴趣,请尝试以下操作:
echo 'your string' | grep -Po '^/home/me/src/K.+' --color