Comment supprimer tout dans une chaîne après un caractère spécifique?
Exemple:
before: text_before_specific_character(specific_character)text_to_be_deleted
after: text_before_specific_character
Je sais que cela peut être fait avec sed. Mais je suis coincé. Quelqu'un peut-il m'aider?
source d'informationauteur knightOfSpring
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de raison d'utiliser un outil externe comme sed, bash peut le faire en interne, à l'aide du paramètre d'extension:
Si le caractère que vous voulez couper, après est
:
par exemple:Vous pouvez le faire dans les deux gourmand et de non-greedy façons:
Surtout si vous êtes à l'appel de cette l'intérieur d'une boucle serrée, le démarrage d'une nouvelle sed processus, l'écriture dans le processus, la lecture de sa sortie, et à attendre la sortie (pour récolter son PID) peut être une charge importante que toutes vos traitement interne de bash de ne pas en avoir.
Maintenant -- souvent, lorsque l'on veut faire, ce que vous pourriez vraiment voulez est de diviser une variable dans les champs, ce qui est mieux fait avec
read
.Par exemple, disons que vous êtes en train de lire une ligne de
/etc/passwd
:Même si vous voulez traiter plusieurs lignes d'un fichier, cela peut aussi être fait avec bash seul et aucun processus externes:
...émettra tout jusqu'à la première
:
de chaque ligne defile
sans nécessiter d'outils externes à être lancé.Ce que vous recherchez est vraiment facile:
Où
A
marque le caractère spécifique. Notez qu'il est sensible à la casse, si vous voulez attraper plusieurs personnages utilisent desSi le TEXTE contient votre texte, comme dans
et le caractère spécifique se produit (par exemple) à
x
puisfait ce que vous voulez.
Bash,
"$TEXT"
ou"${TEXT}"
est l'ensemble de labeforexafter
mais"${TEXT%xafter}"
est justebefore
avec laxafter
coupé la fin. Couper lex
et tout ce qui pourrait la suivre, on écrit"${TEXT%x*}"
.Il est également
"${TEXT%%x*}"
d'ailleurs. Cela diffère de l'autre que si il n'y a plus d'unx
. Avec le%%
Bash côtelettes de désactiver tous lesx
tandis qu'avec la%
il côtelettes seulement à partir de la dernièrex
. Vous pouvez vous souvenir de ce en observant vaguement que le plus%%
côtelettes plus de texte.Vous pouvez faire de même avec Sed, bien sûr, si vous préférez: