2013-08-12 6 views
2

J'ai un titre qui a 5 points consécutifs que je voudrais remplacer avec un seul espace en utilisant le script bash. Faire cela n'aide pas:Remplacer 5 points avec un seul espace

tr '.....' ' ' 

De toute évidence, car il remplace les cinq points avec 5 espaces.

Fondamentalement, j'ai un titre que je veux changé pour un limace. Donc, j'utilise:

tr A-Z a-z | tr '[:punct:] [:blank:]' '-' 

pour changer tout en minuscules et changer toute marque de ponctuation et des espaces pour un trait d'union, mais je suis coincé avec les points.

Le titre que je utilise est quelque chose comme: Believe.....Right Now

donc je veux que transformé en believe-right-now

Comment puis-je modifier les 5 points à un seul espace?

+2

Cette question ne mérite pas un downvote. – ThisSuitIsBlackNot

Répondre

4

Vous n'avez pas besoin sed ou awk. Votre commande originale tr devrait faire l'affaire, vous avez juste besoin d'ajouter le drapeau -s.Après tr traduit les caractères souhaités dans les traits d'union, -s soutire tous les traits d'union répétés en un seul:

tr A-Z a-z | tr -s '[:punct:] [:blank:]' '-' 

Je ne suis pas sûr de ce que le contexte d'entrée/sortie est pour vous, mais je testé ci-dessus comme suit, et il a travaillé pour moi:

tr A-Z a-z <<< "Believe.....Right Now" | tr -s '[:punct:] [:blank:]' '-' 

sortie:

croient-droit maintenant

Voir http://www.ss64.com/bash/tr.html pour référence.

4

Les translittérations sont effectuées avec des mappages, ce qui signifie que chaque caractère est mappé dans autre chose - ou supprimer, avec tr -d. C'est la raison pour laquelle tr '.....' ' ' ne fonctionne pas.

Remplacement cinq points avec l'espace:

  • utilisant sed avec des expressions régulières étendues:

    $ sed -r 's/\.{5}/ /g' <<< "Believe.....Right Now" 
    Believe Right Now 
    
  • utilisant sed sans -r:

    $ sed 's/\.\{5\}/ /g' <<< "Believe.....Right Now" 
    Believe Right Now 
    
  • utilisant l'expansion des paramètres:

    $ text="foo.....bar.....zzz" && echo "${text//...../ }" 
    foo bar zzz 
    

Remplacement cinq points et espaces avec -:

$ sed -r 's/\.{5}| /-/g' <<< "Believe.....Right Now" 
Believe-Right-Now 

Remplacement complet - le creusement de fossés tr utilisation:

$ sed -re 's/\.{5}| /-/g' -e 's/([A-Z])/\l&/g' <<< "Believe.....Right Now" 
believe-right-now 

ou, dans le cas où votre sed version ne prend pas en charge le drapeau -r, vous pouvez utiliser:

$ sed -e 's/\.\{5\}\| /-/g' -e 's/\([A-Z]\)/\l&/g' <<< "Believe.....Right Now" 
believe-right-now 
+2

Vous pouvez rendre l'expression 'sed' un peu plus lisible en utilisant l'option' -r': 'sed -r 's/\. {5}// g'' –

+0

Voici ce que je reçois: sed/option illégale - r usage/sed script [-Ealn] [-i extension] [fichier ...] sed [-Ealn] [-i extension] [-e script] ... [-f script_fichier]. .. [file ...] –

+0

@phptinkerer Votre version 'sed' peut ne pas autoriser les expressions régulières étendues. S'il vous plaît, vérifiez ma modification. – Rubens

2
$ cat file 
Believe.....Right Now 

$ awk '{gsub(/[[:punct:][:space:].]+/,"-"); print tolower($0)}' file 
believe-right-now 
+0

D'une manière ou d'une autre cela semble correct, mais puisque j'utilise un script shell dans Keyboard Maestro, cela ne fonctionnera pas pour moi. Je le veux dans le format que j'ai mentionné dans ma question sans le $ et les variables. J'espère que cela a du sens. –

+0

Veuillez consulter [this] (http://notes.onethingwell.org/images/km-tumblr-safari.png) pour référence. Faites défiler jusqu'à l'endroit où il est écrit Exécuter le script Shell –

+0

Désolé, je ne comprends pas pourquoi vous êtes confus. Le '$' était mon invite (l'invite du shell UNIX standard), sinon utilisez simplement le script tel quel. –

Questions connexes