Supprimer une chaîne spécifique avec tr
Est-il possible de supprimer une chaîne de caractères avec tr
commande UNIX-Shell?
Par exemple: Si je tape:
tr -d "1."
et l'entrée est 1.1231
ce serait montrer 23
en sortie, mais je veux qu'elle affiche 1231
(avis seul le premier 1
a disparu). Comment dois-je procéder?
Si vous connaissez une solution ou une meilleure façon, veuillez expliquer la syntaxe car je ne veux pas simplement copier&coller, mais aussi pour apprendre.
J'ai d'énormes problèmes avec awk, donc si vous utilisez ce service, veuillez l'expliquer encore plus.
source d'informationauteur intelinside
Vous devez vous connecter pour publier un commentaire.
Dans votre exemple, au-dessus de la couper de commande suffit.
Exemple:
echo '1.1231' | cut -d '.' -f 2
serait de retour1231
.Pour plus d'informations sur couperil suffit de taper
man cut
.Vous serait mieux d'utiliser une sorte de regex (peut-être quelque chose comme sed).
Par exemple, avec l'entrée 1.1231 vous pouvez utiliser les éléments suivants pour obtenir le 1231 sortie:
Peut-être avoir un coup d'oeil ici:
http://tldp.org/LDP/abs/html/string-manipulation.html
Vous pouvez également utiliser sed pour ce genre de chose:
C'est seulement à l'aide de sed pour exécuter une expression régulière de rechercher et de remplacer, de remplacer "1." (s'échapper) avec "". Il supprime uniquement le premier match par défaut.
Si vous utilisez
bash
vous pouvez le faire facilement avec paramètre de substitution:Cela permettra d'éliminer l' leader
"1."
chaîne. Si vous souhaitez supprimer jusqu'à et y compris la première occurrence, l'utilisation${a#*1.}
et si vous voulez tout supprimer jusqu'à et y compris la dernier occurrence, l'utilisation${##*1.}
.La TLDP page sur la manipulation de la chaîne a d'autres options (telles que l'extraction de sous-chaîne).
Notez que l'utilisation de la norme
sh
chaîne intégrée des outils de manipulation de ces transformations simples sera toujours beaucoup plus rapide que d'utiliser un outil externe, commesed
awk
oucut
parce que le shell n'a pas à créer un sous-processus pour effectuer l'opération. Cependant, pour plus de choses compliquées (par exemple, vous avez besoin d'utiliser des expressions régulières ou lorsque l'entrée est grande), vous êtes mieux d'utiliser les outils dédiés.Puisque vous avez demandé spécifiquement sur
awk
ici en est une autre.Que tout
awk
tutoriel va vous dire, la forme générale d'unawk
programme est une séquence de " la condition { actions }'. Si vous n'avez pas d'actions, l'action par défaut consiste à imprimer. Si vous n'avez pas de conditions, les actions seront prises de manière inconditionnelle. Ce programme utilise deux de ces cas spéciaux.La première partie est une action sans condition, c'est à dire qu'il sera pris pour toutes les lignes. L'action consiste à remplacer toutes les occurrences de l'expression régulière
/1\./
avec rien. Ce qui permettra de couper n'importe quel '1.' (quel que soit le contexte) à partir d'une ligne.La deuxième partie est une condition sans une action, c'est à dire qu'elle sera imprimée si la condition est vraie, et la condition est toujours vraie. Il s'agit d'un idiome pour "nous fait-imprimer tout ce que nous avons maintenant". Il se compose simplement de la constante de
1
(qui, lorsqu'il est utilisé comme une condition signifie "vrai", tout simplement).Ce pourrait être reformulé dans un certain nombre de façons. Par exemple, vous pourriez facteur de l'impression dans la première action;
Peut-être que vous voulez remplacer la partie entière, c'est à dire tous les numéros avant un signe de période. La regex pour ce qui serait quelque chose comme
/[0-9]+\./
.gsub
est une extension GNU, de sorte que vous pouvez le remplacer parsub
ou une sorte de boucle si vous avez besoin de portabilité à l'héritageawk
syntaxe.