J'ai un fichier comme ci-dessous:
line1
line2
line3
Et je veux obtenir:
prefixline1
prefixline2
prefixline3
Je pourrais écrire un script Ruby, mais c'est mieux si je n'en ai pas besoin.
prefix
contiendra /
. C'est un chemin, /opt/workdir/
par exemple.
linux
scripting
text-processing
pierrotlefou
la source
la source
sed
pour les tâches légères comme celle-ci. Si "préfixe" est connu, il est très facile de choisir un caractère qui ne fait pas partie de "préfixe".sed
dans un pipeline, par exemplefoo | sed -e 's/^/x /' | bar
.sed -e '2,$s/^/prefix/'
./
même chose\/
(dans les chaînes entre guillemets simples) ou\\/
(dans les chaînes entre guillemets doubles)sed -e 's/$/postfix/' file
si vous souhaitez ajouter une chaîne à la fin de chaque ligne.Avec Perl (remplacement en place):
la source
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
rapportsawk: out of memory in readrec 1 source line number 1
, mais la solution avec sesed
termine avec succès.Vous pouvez utiliser Vim en mode Ex:
%
sélectionner toutes les ligness
remplacerx
sauver et fermerla source
:%s/^/prefix/
, car cette stratégie finit par être utile dans de nombreuses situationsSi votre préfixe est un peu compliqué, mettez-le simplement dans une variable:
Ensuite, vous passez cette variable et laissez awk s'en occuper:
la source
Si vous avez Perl:
la source
Utilisation du shell:
la source
Voici une solution
ts
oneliner très lisible utilisant la commande de moreutilsEt comment il est dérivé étape par étape:
la source
Bien que je ne pense pas que pierr ait eu cette préoccupation, j'avais besoin d'une solution qui ne retarderait pas la sortie de la "queue" en direct d'un fichier, car je voulais surveiller plusieurs journaux d'alertes simultanément, en préfixant chaque ligne avec le nom de son journal respectif. .
Malheureusement, sed, cut, etc. ont introduit trop de tampons et m'ont empêché de voir les lignes les plus récentes. La suggestion de Steven Penny d'utiliser l'
-s
option denl
était intrigante, et les tests ont prouvé qu'elle n'introduisait pas la mise en mémoire tampon indésirable qui me concernait.Il y avait quelques problèmes avec l'utilisation
nl
liés au désir de supprimer les numéros de ligne indésirables (même si vous ne vous souciez pas de l'esthétique, il peut y avoir des cas où l'utilisation des colonnes supplémentaires ne serait pas souhaitable). Tout d'abord, l'utilisation de «couper» pour supprimer les chiffres réintroduit le problème de mise en mémoire tampon, ce qui détruit la solution. Deuxièmement, l'utilisation de "-w1" n'aide pas, car cela ne restreint PAS le numéro de ligne à une seule colonne - il devient juste plus large car plus de chiffres sont nécessaires.Ce n'est pas joli si vous voulez capturer cela ailleurs, mais comme c'est exactement ce que je n'avais pas besoin de faire (tout était déjà écrit dans des fichiers journaux, je voulais juste en regarder plusieurs à la fois en temps réel), le meilleur moyen de perdre les numéros de ligne et de n'avoir que mon préfixe était de commencer la
-s
chaîne par un retour chariot (CR ou ^ M ou Ctrl-M). Ainsi, par exemple:la source
-u
option sed pour éviter la mise en mémoire tampon.Utilisation de ed:
Ceci remplace, pour chaque ligne (
,
), le début de la ligne (^
) parprefix
.wq
enregistre et quitte.Si la chaîne de remplacement contient une barre oblique, nous pouvons utiliser un délimiteur différent pour
s
:J'ai cité le délimiteur here-doc
EOE
("end of ed") pour empêcher l'expansion des paramètres. Dans cet exemple, cela fonctionnerait également sans guillemets, mais il est recommandé d'éviter les surprises si vous en avez un$
dans votre script ed.la source
En utilisant & (toute la partie de l'entrée correspondant au motif »):
OU en utilisant des références arrières:
la source
Vous pouvez également y parvenir en utilisant la technique de référence arrière
Vous pouvez également utiliser avec awk comme celui-ci
la source
Voici un exemple résumé utilisant l'
sed
approche de cette réponse :prefix_lines
la source
PREFIX
contient des caractères spéciaux pour sed comme une barre oblique.prefix_lines \*
Pour les personnes sur les systèmes BSD / OSX, il existe un utilitaire appelé
lam
, abréviation de stratifié.lam -s prefix file
fera ce que vous voulez. Je l'utilise dans les pipelines, par exemple:find -type f -exec lam -s "{}: " "{}" \; | fzf
... qui trouvera tous les fichiers, exécutera sur chacun d'eux, donnant à chaque fichier un préfixe de son propre nom de fichier. (Et pompez la sortie vers fzf pour la recherche.)
la source