Если ваше единственное требование - превратить ..
в «на один уровень», то это возможное решение. Он не использует регулярные выражения или СЭД, или JVM по этому вопросу;)
#!/bin/bash
domain="www.example.com"
origin="1/2/3/4/index.php"
rel="../../index.php"
awk -v rel=$rel -v origin=$origin -v file=$(basename $rel) -v dom=$domain '
BEGIN {
n = split(rel, a, "/")
for(i = 1; i <= n; ++i) {
if(a[i] == "..") ++c
}
abs = dom
m=split(origin, b, "/")
for(i = 1; i < m - c; ++i) {
abs=abs"/"b[i]
}
print abs"/"file
}'
Альтернативный подход к использованию awk
, кредит Эдварду за упоминание realpath -m
:
#!/bin/bash
rel="../../index.php"
origin="www.example.com/1/2/index.php"
directory=$(dirname $origin)
fullpath=$(realpath -m "$directory/$rel")
echo ${fullpath#$(pwd)/}
это почти продублируйте из http://stackoverflow.com/questions/4444475/transfrom-relative-path-into-absolute-url-using-php – qdinar