J'écris une fonction dans zsh
laquelle a une chaîne
"find . -a -print:10"
la :10
pièce doit être coupée à droite. Cela pourrait changer à l’avenir pour devenir :23
ou :77
etc, 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:10
devrait devenirfind . -a -print
etfind . -a -print
devrait rester commefind . -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 sed
expression
sed -nr 's/(.*)(:[0-9]+)/\1/p' <<<'find . -a -print'
# no output
Comment puis-je couper cette chaîne?
"${str%:*}"
)?sed
Ne tue aucune ligne à moins que vous ne le lui disiez.*
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%:*}"
correspondrabar.txt
. Je suis sûr qu'il yzsh
a des globbing plus sophistiqués (globs étendus) mais je n'ai pas d'expérience avec eux.string
correspondance correspond à la regex:[0-9]+$
(et si elle met à jour lastring
valeur${string%:*}
)Réponses:
Pourquoi utilisez
-n
-vous si vous ne voulez pas supprimer la sortie par défaut?Il suffit d'utiliser:
la source
-n
avec l's///p
indicateur. Je souhaite donc supprimer l'impression automatique de l'espace de modèle, mais explicitement les substitutions d'impression