我正在尝试用“..”替换路径中的所有文件夹,这是一个更大脚本的一部分,该脚本最终会将一些绝对路径替换为相对路径。
预期输出应如下所示:
/ABCDdasda234sEA/asdas2das/asdasf34234/ => /../../../
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/ => /../../../../
我尝试了各种正则表达式,但无法正确匹配,因为最后一个“/”被认为是字符串的结尾而不是多次匹配:
[root@test]# sed "s/^\/.*\/$/\/..\//g" <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/"
/../
答案1
1).*
会吃掉包括以下斜线在内的所有内容,因此请使用[^/]*
(除斜线之外的任意数量的字符)
2) 为了避免\+
在所有版本中不可用的(“一次或多次出现”),sed
只需添加一个需要至少一个字符的点。[^/]
如果您相信没有其他人,那么您不需要这里另一个//
s
3) 只是为了美化:如果模式或替换包含斜杠,如果您为命令使用不同的分隔符,例如_
or ,则更容易阅读#
全部一起:
sed 's_/.[^/]*_/.._g'
答案2
awk -F/ -v OFS=/ '{for (i=1; i<=NF; i++) if (length($i)) $i = ".."}1' <<END
/ABCDdasda234sEA/asdas2das/asdasf34234/
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/
END
/../../../
/../../../../
答案3
同时我又发现了两种方法:
sed 's:/[[:alnum:]]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346346/" | sed 's:^..::g'
awk -F'/' '{for( i = 2; i <= NF-1; i++ ) printf "/../" }' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/asfasddfg/2345555/" | sed 's/\/\//\//g'
还包括其他特殊字符,例如“_”:
sed 's:/[[:alnum:]_]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346$346/" | sed 's:^..::g'
答案4
某些版本的sed不接受正则表达式的高级功能(例如+或者{}) 默认情况下。在我的系统上,\+工作正常。
另外,您可以更换\w在这里与[^/],因为文件名可能包含空格。