sed 或 awk 替换模式之间的字符串(将绝对路径转换为相对路径)

sed 或 awk 替换模式之间的字符串(将绝对路径转换为相对路径)

我正在尝试用“..”替换路径中的所有文件夹,这是一个更大脚本的一部分,该脚本最终会将一些绝对路径替换为相对路径。

预期输出应如下所示:

/ABCDdasda234sEA/asdas2das/asdasf34234/ => /../../../
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/ => /../../../../

我尝试了各种正则表达式,但无法正确匹配,因为最后一个“/”被认为是字符串的结尾而不是多次匹配:

[root@test]# sed "s/^\/.*\/$/\/..\//g" <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/"

/../

答案1

1).*会吃掉包括以下斜线在内的所有内容,因此请使用[^/]*(除斜线之外的任意数量的字符)

2) 为了避免\+在所有版本中不可用的(“一次或多次出现”),sed只需添加一个需要至少一个字符的点。[^/]如果您相信没有其他人,那么您不需要这里另一个//

s3) 只是为了美化:如果模式或替换包含斜杠,如果您为命令使用不同的分隔符,例如_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在这里与[^/],因为文件名可能包含空格。

相关内容