3

入力:

  • ベース URL:www.example.com/1/2/index.php
  • 相対 URL:../../index.php

出力:

  • 絶対 URL:www.example.com/index.php

それはsedを使用して行われるため、完璧です。

私が理解しているように、この正規表現はURLsomefolder/ごと../に 1 つずつ削除する必要があります。

4

4 に答える 4

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)/}"
于 2013-10-27T15:59:24.553 に答える
1

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 realpathinfo coreutils 'realpath invocation'

于 2013-10-27T16:15:25.300 に答える
-3

正規表現はカウントできないため、単一の正規表現を使用することはできません。

代わりに、実際のプログラミング言語を使用する必要があります。Java でもこれを簡単に行うことができます。

于 2013-10-27T13:49:51.487 に答える