2009-02-06 11 views
1

J'écris un script shell (bash) et j'essaie de trouver un moyen facile d'accomplir une tâche simple.Rechercher et remplacer dans Shell

J'ai une chaîne dans une variable. Je ne sais pas si cela est pertinent, mais il peut contenir des espaces, des retours à la ligne, parce qu'en réalité cette chaîne est le contenu d'un fichier texte entier.

Je souhaite remplacer la dernière occurrence d'une certaine sous-chaîne par autre chose. Peut-être que je pourrais utiliser une expression rationnelle pour cela, mais il y a deux moments qui me confondent:

  • je dois correspondre à compter de la fin, et non dès le début
  • la sous-chaîne que je veux pour rechercher est fixe , pas variable.

Répondre

4
  • pour tronquer au début: ${var#pattern}
  • tronquer à la fin ${var%pattern}
  • ${var/pattern/repl} pour le remplacement général

les modèles sont l'expansion du style 'filename', et le dernier peut être préfixées avec # ou % pour ne correspondre qu'au début ou à la fin (respectivement)

tout est dans la page de manuel (long) bash. consultez le chapitre "Extension des paramètres".

0

Je chercherais les pages man pour awk ou sed.

1

amn expression comme ce

s/match string here$/new string/ 

devrait faire l'affaire - s est pour le substituer,/briser la commande et le $ est le marqueur de fin de ligne. Vous pouvez essayer ceci dans vi pour voir si cela fait ce dont vous avez besoin.

0

La réponse de Javier est spécifique au shell et ne fonctionnera pas dans toutes les coques.

Les réponses sed MrTelly et epochwolf fait allusion sont incomplets et devraient ressembler à ceci:.

MyString="stuff ttto be edittted" 
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'` 

La raison pour laquelle cela fonctionne sans avoir à utiliser le $ pour marquer la fin est que le premier » * 'est gourmand et tentera de rassembler autant que possible tout en permettant au reste de l'expression régulière d'être vraie.

Cette commande sed devrait fonctionner correctement dans n'importe quel contexte de shell utilisé.

+0

Cela peut être simplifié à 's/^ \ (. * \) Ttt/\ 1xxx /' En outre si vous utilisez 'bash 'the' here-string' '' <<< "$ MyString" 'peut être utilisé. – potong

Questions connexes