So passen Sie ein oder mehrere Zeichen an, die keine Schrägstriche sind

So passen Sie ein oder mehrere Zeichen an, die keine Schrägstriche sind

Mir wird ein relativer Pfad gegeben, der n Ebenen tief abwärts führt, und ich möchte den „umgekehrten“ Pfad erstellen, der die gleiche Anzahl von Ebenen nach oben führt. Ich möchte die gleiche Anzahl von Ebenen mit oder ohne abschließendes Leerzeichen erstellen. Beispiel:

dir/subdir/subsubdir  should produce ../../..
dir/subdir/subsubdir/ should produce ../../../

Warum findet ein Plus-Operator keine Entsprechung? Bedeutet das nicht, dass ein oder mehrere Zeichen, die keine Schrägstriche sind, vorhanden sind?

$ echo dir/subdir/subsubdir | sed 's|[^/]+|..|g'
dir/subdir/subsubdir

Während eine einzelne Zeichenübereinstimmung, gefolgt von einer Sternübereinstimmung, funktioniert:

$ echo dir/subdir/subsubdir | sed 's|[^/][^/]*|..|g'
../../..

sogar mit abschließendem Schrägstrich:

$ echo dir/subdir/subsubdir/ | sed 's|[^/][^/]*|..|g'
../../../

Anstelle des Pluszeichens (+) funktioniert übrigens auch ein Sternchen (*):

$ echo dir/subdir/subsubdir | sed 's|[^/]*|..|g'
../../..

aber dann reicht ein abschließender Schrägstrich nicht aus, weil er eine weitere Ebene hinzufügt:

$ echo dir/subdir/subsubdir/ | sed 's|[^/]*|..|g'
../../../../..

Antwort1

Leider gibt es viele Varianten der Regex-Syntax, jede mit ihren eigenen kleinen (oder manchmal auch nicht so kleinen) Variationen. Vorausgesetzt, Sie verwenden GNU sed, würde jede dieser Optionen funktionieren:

$ echo dir/subdir/subsubdir | sed 's|[^/]\+|..|g'
../../..
$ echo dir/subdir/subsubdir | sed -r 's|[^/]+|..|g'
../../..

Im Allgemeinen sollten Sie auf der Manpage des von Ihnen genutzten Tools nachsehen, welche Variante es verwendet.

verwandte Informationen