If your only requirement is to turn ..
into "up one level" then this is a possible solution. It doesn't use regular expressions or sed, or a JVM for that matter ;)
#!/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
}'
An alternative approach to using awk
, credit to Edward for mentioning 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)/}"