Ich muss in der Lage sein, ein Leerzeichen ( ) durch einen Punkt (
.
) in einer Zeichenfolge in Bash zu ersetzen .
Ich denke, das wäre ziemlich einfach, aber ich bin neu, daher kann ich nicht herausfinden, wie ich ein ähnliches Beispiel für diese Verwendung ändern kann.
tr
lange Saiten bevorzugen . Auf meinem Systemtr
übertrifft Bash ab Zeichenfolgen mit mehr als1000
Zeichen. Es scheint, dass die zeitliche Komplexität von bash schlimmer als linear ist. Ein kleiner Test :x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Mit einer Stringlänge von 1M (= 2 ^ 20)tr
nahm0.04s
und Bash 5.0.11 nahm17s
. Mit 2Mtr
dauerte0.07s
(erwartet), aber Bash dauerte69s
(4-mal so lang für die doppelte Saitenlänge).tr
zu tun! ... Abhängig vom verfügbaren Speicher und den Hardware-Ressourcen ... Aber Sie haben Recht!: Je nach Art der zu erledigenden Aufgabe bleiben dedizierte Tools effizienter!$'\n'
Sie könnten
tr
wie folgt verwenden:Beispiel:
Von
man tr
:quelle
In Bash können Sie mit dem Konstrukt Muster in einer Zeichenfolge ersetzen
${VARIABLE//PATTERN/REPLACEMENT}
. Verwenden Sie nur/
und nicht//
, um nur das erste Vorkommen zu ersetzen. Das Muster ist wie Platzhalter ein Platzhaltermuster.quelle
Versuche dies
quelle
Verwenden Sie die Parametersubstitution:
quelle
Versuchen Sie dies für Pfade:
Es ersetzt das Leerzeichen in der Zeichenfolge in doppelten Anführungszeichen durch ein
+
Sing, ersetzt dann das+
Zeichen durch einen Backslash und entfernt / ersetzt die doppelten Anführungszeichen.Ich musste dies verwenden, um die Leerzeichen auf einem meiner Pfade in Cygwin zu ersetzen.
quelle
sed
. Die Anführungszeichen sind irrelevant.