Je dois pouvoir faire est de remplacer un espace ( ) par un point (
.
) dans une chaîne en bash.
Je pense que ce serait assez simple, mais je suis nouveau donc je ne peux pas comprendre comment modifier un exemple similaire pour cette utilisation.
tr
les chaînes longues. Sur mon système, iltr
surpasse les performances de bash en commençant par des chaînes de plus de1000
caractères. Il semble que la complexité temporelle de bash soit pire que linéaire. Un petit test:x="$(tr -dc 'a-z \n' </dev/urandom | head -c1M)"; time y="$(tr ' ' \\- <<< "$x")"; time z="${x// /-}"
. Avec une longueur de chaîne de 1M (= 2 ^ 20) atr
pris0.04s
et bash 5.0.11 a pris17s
. Avec 2M atr
pris0.07s
(attendu) mais bash a pris69s
(4 fois plus longtemps pour deux fois la longueur de la chaîne).tr
! ... En fonction de la mémoire disponible et des ressources matérielles ... Mais vous avez raison!: Selon le type de travail à faire, les outils dédiés restent plus efficaces!$'\n'
Vous pouvez utiliser
tr
, comme ceci:Exemple:
De
man tr
:la source
En bash, vous pouvez effectuer un remplacement de modèle dans une chaîne avec la
${VARIABLE//PATTERN/REPLACEMENT}
construction. Utilisez juste/
et non//
pour remplacer uniquement la première occurrence. Le modèle est un modèle générique, comme les globes de fichiers.la source
Essaye ça
la source
Utilisez la substitution de paramètres:
la source
Essayez ceci pour les chemins:
Il remplace l'espace à l'intérieur de la chaîne entre guillemets doubles par un
+
chant, puis remplace le+
signe par une barre oblique inverse, puis supprime / remplace les guillemets doubles.J'ai dû l'utiliser pour remplacer les espaces dans l'un de mes chemins dans Cygwin.
la source
sed
. Les citations ne sont pas pertinentes.