Angesichts der Antwort auf Teil 1 (das gemeinsame Präfix) ist die Antwort für Teil 2 einfach; Sie schneiden das Präfix von jedem Namen ab, was unter anderem mit sed
geschehen könnte.
Der interessante Teil ist dann, das gemeinsame Präfix zu finden. Das minimale gemeinsame Präfix ist /
(z. B. für /etc/passwd
und /bin/sh
). Das maximale gemeinsame Präfix ist (per Definition) in allen Strings vorhanden, daher müssen wir einfach einen der Strings in Segmente aufteilen und mögliche Präfixe mit den anderen Strings vergleichen. Im Überblick:
Es gibt einige administrative Details, z. B. Leerzeichen in Namen. Was sind die erlaubten Waffen? Die Frage ist mit bash
markiert, aber welche externen Befehle sind erlaubt (zB Perl)?
Ein undefiniertes Problem - Angenommen, die Liste der Namen lautete:
%Vor% Ist das längste gemeinsame Präfix /abc/def
oder /abc/def/ghi
? Ich gehe davon aus, dass das längste gemeinsame Präfix hier /abc/def
ist. (Wenn Sie wirklich möchten, dass es /abc/def/ghi
ist, dann verwenden Sie /abc/def/ghi/.
für den ersten der Namen.)
Außerdem gibt es Aufrufdetails:
longest_common_prefix
und 'path_without_prefix')? Zwei Befehle sind einfacher:
prefix=$(longest_common_prefix name1 [name2 ...])
suffix=$(path_without_prefix /pre/fix /pre/fix/to/file [...])
Der Befehl path_without_prefix
entfernt das Präfix, wenn es vorhanden ist, und lässt das Argument unverändert, wenn das Präfix den Namen nicht startet.
Test:
%Vor%Ausgabe:
%Vor%Test:
%Vor%Ausgabe:
%Vor%Eine eher "portable" Lösung in dem Sinne, dass sie keine bash-spezifischen Funktionen verwendet: Definieren Sie zuerst eine Funktion, um das längste gemeinsame Präfix von zwei Pfaden zu berechnen:
%Vor%Dann verwenden Sie es für eine lange Liste von Wörtern:
%Vor%Mit Ihrer Eingabe gibt es
%Vor%Wie Jonathan Leffler darauf hingewiesen hat, ist die zweite Frage, wenn Sie das einmal haben, trivial.
Hier ist eine , die nachweislich mit beliebig komplexe Dateinamen (enthält Zeilenumbrüche, Backspaces und ähnliches):
%Vor%Mir scheint, dass die folgende Lösung viel einfacher ist.
Wie bereits erwähnt, ist nur Teil 1 schwierig. Teil 2 ist einfach mit sed.
Teil 1 kann in zwei Teile geteilt werden:
Es kann mit dem folgenden Code getan werden. In diesem Beispiel werden aus Gründen der Übersichtlichkeit nur 2 Strings verwendet, aber eine while-Schleife gibt Ihnen das, was Sie wollen, mit n Strings.
%Vor%was natürlich in nur einer Zeile umgeschrieben werden kann:
%Vor%Tags und Links bash