Comment puis-je bien couper une chaîne avec sed - et ne pas tuer la chaîne si le motif n'y est pas?


0

J'écris une fonction dans zshlaquelle a une chaîne

"find . -a -print:10"

la :10pièce doit être coupée à droite. Cela pourrait changer à l’avenir pour devenir :23ou :77etc, donc il semble qu’un modèle :[0-9]+soit nécessaire.

aussi, la chaîne pourrait avoir la forme

find . -a -print

Dans ce cas, s'il n'y a pas de :[0-9]+motif à la fin, la chaîne doit rester inchangée.

alors

  • find . -a -print:10devrait devenir find . -a -print
    et
  • find . -a -print devrait rester comme find . -a -print

Ce que j'ai essayé jusqu'à présent

% sed -nr 's/(.*)(:[0-9]+)?/\1/p' <<<'find . -a -print:10'
find . -a -print:10     # ':10' not getting trimmed

Si j'essaye

sed -nr 's/(.*)(:[0-9]+)/\1/p' <<<'find . -a -print:10'
find . -a -print  # ':10' getting trimmed GOOD ✔✔ 

mais la même sedexpression

 sed -nr 's/(.*)(:[0-9]+)/\1/p' <<<'find . -a -print'
 # no output

Comment puis-je couper cette chaîne?


3
Pourquoi voudriez-vous utiliser sed pour cela - plutôt que les capacités d'expansion des paramètres de votre shell (par exemple "${str%:*}")?
— Steeldriver

"Comment puis-je bien couper une chaîne avec sed - et ne pas tuer la chaîne si le motif n'y est pas?" - sedNe tue aucune ligne à moins que vous ne le lui disiez.
— Wildcard

À la bonne question de Steeldriver, j'allais en parler, mais je ne voulais pas que la question soit trop longue. c'est parce que les *globes correspondent à trop de caractères, c'est-à-dire que si la chaîne devient, find -iname "foo\:bar.txt"alors le glob '*' dans "${str%:*}"correspondra bar.txt. Je suis sûr qu'il y zsha des globbing plus sophistiqués (globs étendus) mais je n'ai pas d'expérience avec eux.
— the_velour_fog

Ceci est presque une copie du test du shell pour trouver un motif dans une chaîne, car c'est ce que vous voulez: testez si votre stringcorrespondance correspond à la regex :[0-9]+$(et si elle met à jour la stringvaleur ${string%:*})
— don_crissti

Réponses:


3

Pourquoi utilisez -n-vous si vous ne voulez pas supprimer la sortie par défaut?

Il suffit d'utiliser:

sed -E -e 's/:[0-9]+$//'

Je l'utilise -navec l' s///pindicateur. Je souhaite donc supprimer l'impression automatique de l'espace de modèle, mais explicitement les substitutions d'impression
— the_velour_fog

@the_velour_fog, d'accord, mais vous souhaitez également imprimer s'il n'y a pas de substitution. C'est littéralement le sens du titre de votre question.
— Wildcard

Oui tu as raison, j'allais totalement dans le mauvais sens, c'est bien sûr ce que j'aurais dû faire depuis le début ... merci :)
— the_velour_fog

@the_velour_fog :)
— Wildcard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.