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?

the_velour_fog
la source
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]+$//'
Wildcard
la source
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