Ajouter un préfixe au début de chaque ligne

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'avez pas besoin.

prefix contiendra /. C'est un chemin, /opt/workdir/, par exemple.

250
demandé sur Benjamin W. 2010-01-20 09:36:31

9 réponses

sed -e 's/^/prefix/' file

# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file

# If you want to create a new file
sed -e 's/^/prefix/' file > file.new

Si prefix contient /, vous pouvez utiliser n'importe quel autre personnage n'est pas dans prefix, ou échapper à la /, de sorte que la commande sed devient

's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
395
répondu Alok Singhal 2013-11-30 23:53:42
awk '$0="prefix"$0' file > new_file
105
répondu Vijay 2013-12-16 12:19:27

Vous pouvez utiliser Vim en mode Ex:

ex -sc '%s/^/prefix/|x' file
  1. % sélectionnez toutes les lignes

  2. s remplacer

  3. x enregistrez et fermez

28
répondu Steven Penny 2016-11-05 14:30:30

Si votre préfixe est un peu compliqué, il suffit de le mettre dans une variable:

prefix=path/to/file/

Ensuite, vous passez cette variable et laissez awk s'en occuper:

awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
15
répondu Melka 2017-02-26 16:54:40

Si vous avez Perl:

perl -pe 's/^/PREFIX/' input.file
6
répondu Majid Azimi 2013-12-11 20:08:27

Utilisation du shell:

#!/bin/bash
prefix="something"
file="file"
while read -r line
do
 echo "${prefix}$line"
done <$file > newfile
mv newfile $file
4
répondu ghostdog74 2017-02-26 16:42:19

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, puisque je voulais surveiller plusieurs journaux d'alerte simultanément, préfixant chaque ligne avec le nom de son journal respectif.

Malheureusement, sed, cut, etc. introduit trop de tampon et m'a empêché de voir les lignes les plus actuelles. La suggestion de Steven Penny d'utiliser l'option -s de {[2] } était intrigante, et les tests ont prouvé qu'elle n'introduisait pas le tampon indésirable qui m'a concerné.

Il y avait quelques problèmes avec l'utilisation de nl, cependant, 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 de celui-ci, il peut y avoir des cas où l'utilisation des colonnes supplémentaires serait indésirable). Tout d'abord, l'utilisation de "cut" pour supprimer les nombres réintroduit le problème de mise en mémoire tampon, de sorte qu'il détruit la solution. Deuxièmement, l'utilisation de "- w1" n'aide pas, car cela ne limite pas le numéro de ligne à une seule colonne - il est juste plus large que plus de chiffres sont nécessaires.

Ce n'est pas joli si vous voulez capturer cela ailleurs, mais puisque 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), la meilleure façon de perdre les numéros de ligne et n'avoir que mon préfixe était de démarrer la chaîne -s avec un retour chariot (CR ou ^m ou Ctrl-M). Ainsi, par exemple:

#!/bin/ksh

# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.

PGRP=$$

for LOGFILE in widget framas dweezil
do
(
    tail -f $LOGFILE 2>&1 |
    nl -s"^M${LOGFILE}>  "
) &
sleep 1
done

read KILLEM

kill -- -${PGRP}
2
répondu ScriptGuy 2017-02-26 16:54:04

En utilisant ed:

ed infile <<'EOE'
,s/^/prefix/
wq
EOE

Cette remplaçants, pour chaque ligne (,), le début de la ligne (^) avec prefix. wq enregistre et quitte.

Si la chaîne de remplacement contient une barre oblique, nous pouvons utiliser un délimiteur différent pour s à la place:

ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE

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 aussi sans citation, mais il est recommandé d'éviter les surprises si vous avez un $ dans votre ed script.

1
répondu Benjamin W. 2018-06-28 14:32:41

Voici un exemple enveloppé en utilisant l'approche sed de cette réponse :

$ cat /path/to/some/file | prefix_lines "WOW: "

WOW: some text
WOW: another line
WOW: more text

Prefix_lines

function show_help()
{
  IT=$(CAT <<EOF
    Usage: PREFIX {FILE}

    e.g.

    cat /path/to/file | prefix_lines "WOW: "

      WOW: some text
      WOW: another line
      WOW: more text
  )
  echo "$IT"
  exit
}

# Require a prefix
if [ -z "$1" ]
then
  show_help
fi

# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
  # If no stdin exists
  if [ -t 0 ]; then
    show_help
  fi
  FILE=/dev/stdin
fi

# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE
0
répondu Brad Parks 2017-05-23 12:18:17