入力:
- ベース URL:
www.example.com/1/2/index.php
- 相対 URL:
../../index.php
出力:
- 絶対 URL:
www.example.com/index.php
それはsedを使用して行われるため、完璧です。
私が理解しているように、この正規表現はURLsomefolder/
ごと../
に 1 つずつ削除する必要があります。
あなたの唯一の要件が..
「1つ上のレベル」になることである場合、これは可能な解決策です。正規表現やsed、または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)/}"
realpath
は、やりたいことを実行するための簡単ですが、少しハックな方法です。
(実際には、URL を適切に処理しないことに驚いています。URL を単純な古いファイルシステム パスとして扱います。)
~$ realpath -m http://www.example.com/1/2/../../index.php
=>
~$ /home/username/http:/www.example.com/index.php
( -m
"missing" の場合) は、そのコンポーネントが実際にはパスを解決しない場合でも、パスを解決するように言います。ファイルシステムに存在します。
そのため、実際のファイルシステム部分を取り除く必要があります (これは$(pwd)
. ://" を入力のオフにして、代わりに出力の先頭に追加します。完全なストーリーについては、
を参照してください。情報システムがインストールされている場合は、より詳細な完全なストーリーを参照してください。man 1 realpath
info coreutils 'realpath invocation'
正規表現はカウントできないため、単一の正規表現を使用することはできません。
代わりに、実際のプログラミング言語を使用する必要があります。Java でもこれを簡単に行うことができます。