J'ai rencontré un problème en essayant d'écrire un script Bash. Lors de la grep
sortie, il renvoie (généralement) de nombreuses lignes. Je voudrais préfixer et suffixer une chaîne à chacune de ces lignes de sortie.
Je voudrais aussi noter que je tuyauterie ls
en grep
, comme:
ls | grep
bash
shell-script
grep
SpecialBomb
la source
la source
ls
- c'est du mauvais juju. De plus, cela doit-il êtregrep
? Et pouvez-vous donner un exemple de sortie?Réponses:
Avec sed:
la source
sed
étant un surensemble degrep
:ls | sed -n '/txt/s/.*/prefix&suffix/p'
ouls | sed -n 's/.*txt.*/prefix&suffix/p'
Avec
sed
:Mais notez que cela souffre de problèmes avec les noms de fichiers avec des sauts de ligne et tous les problèmes assortis d'analyse syntaxique,
ls
ce qui est généralement une mauvaise idée.Avec perl
Remarque - perl
grep
peut prendre un modèle - comme lagrep
commande, mais vous pouvez également faire des choses comme appliquer des tests de fichiers.Par exemple
Dans
grep
l'itérateur par défaut$_
est défini sur la valeur actuelle de l'élément, vous pouvez donc appliquersed
/grep
style regex, ou effectuer une variété de tâches basées sur$_
.la source
“
et utilisez simplement em.Dans ce cas, GNU
find
vous permet de faire toutes ces choses en une seule fois, en éliminant les canaux et l'analyse potentiellement gênante dels
:(ce
find
n'est pas un bon moyen de modifier arbitrairement la sortie d'autres commandes, bien sûr!)Quelques notes:
-maxdepth 1
et-name [^.]*
faire fonctionner l'appariement des noms de la même manière qu'une plainels
(ouls .
). Vous pouvez utiliser n'importe quel glob de style shell, mais notez que "*" correspondra à un "". dans un nom † différentbash
,[^.]*
signifie donc tout ce qui n'a pas de ".".*thing.*
au lieu de simplementthing
-name
/-regex
au lieu des deux (par exemple -regex "[^.]. MYPATTERN. "-printf
les soutiens beaucoup de choses ,%n
est le nom de fichier ou de répertoire sans fiorituresComme alternative possible sans aucun programme externe requis,
bash
acompgen
qui, entre autres, étend les globs, équivalent à unls
sans options:Cela gère les noms de fichiers avec des espaces, y compris les retours à la ligne.
compgen -G "*"
devrait fournir la même sortie qu'un simplels
(mais notez quels *
c'est une chose complètement différente). Vous aurez toujours besoingrep
, et cela peut ou non résoudre le problème, mais cela vaut la peine d'être mentionné.la source
sed
et lesfind
solutions sont contestées si votre préfixe / suffixe comprend des caractères de clé d'expression régulière ou si vous souhaitez passer une variable d'environnement (au lieu d'une valeur immédiate),xargs
+echo
pourrait être plus approprié ici.Avec variable d'environnement:
Avec un inline:
la source