127 votes

Comment insérer une nouvelle ligne devant un motif?

Pas comment insérer une nouvelle ligne avant une ligne. Ceci demande comment insérer une nouvelle ligne avant un motif dans une ligne.

Par exemple,

 sed 's/regexp/&\n/g'
 

insérera une nouvelle ligne derrière le motif d'expression rationnelle.

Comment puis-je faire la même chose mais devant le motif?

Voici un exemple de fichier d'entrée

somevariable (012)345-6789

Devraient devenir

somevariable

(012)345-6789

167voto

mojuba Points 1583

Cela fonctionne sur Linux et OS X:

sed 's/regexp/\'$'\n/g'

En général, pour $ suivie par un littéral de chaîne avec une barre oblique inverse bash effectue de style C barre oblique inverse de substitution, par exemple, $'\t' est traduite en un littéral de l'onglet. De Plus, sed souhaite votre retour à la ligne littéral de le faire précéder d'une barre oblique inverse, d'où l' \ avant $. Et enfin, le signe dollar lui-même ne devrait pas être cité, de sorte qu'il est interprété par le shell, donc nous fermer le devis avant la $ et immédiatement l'ouvrir à nouveau.

Mise à jour: la méthode ci-dessus peut être utilisé pour n'importe quel style C "escapable" char. Si vous avez besoin d'une nouvelle ligne, puis c'est peut-être plus facile à retenir:

sed "s/regexp/`echo`/g"

Notez les guillemets dans ce cas, c'est parce que la commande echo dans backticks `echo` devrait être interprété par le shell.

42voto

Dennis Points 5020

J'ai essayé certains exemples mais ils ne semblaient pas fonctionner. Cependant, j'ai trouvé une solution. Je devais simplement changer la position de & et \ n.

 sed 's/regexp/\n&/g' 
 

edit: Cela ne fonctionne apparemment pas sur un Mac. Voir la réponse ci-dessous qui fonctionne pour Mac.

33voto

tgamblin Points 25755

Dans sed, vous ne pouvez pas ajouter des retours à la ligne dans le flux de sortie facilement. Vous avez besoin d'utiliser une continuation de la ligne, ce qui est étrange, mais ça fonctionne:

$ sed 's/regexp/\
&/'

Exemple:

$ echo foo | sed 's/.*/\
&/'

foo

Voir ici pour plus de détails. Si vous voulez quelque chose d'un peu moins maladroit, vous pouvez essayer d'utiliser perl -pe avec le match de groupes de la place de la sed:

$ echo foo | perl -pe 's/(.*)/\n$1/'

foo

$1 fait référence au premier groupe correspondant à l'expression régulière, où les groupes sont entre parenthèses.

29voto

Roar Skullestad Points 802

Sur mon mac, ce qui suit insère un seul 'n' au lieu de newline:

 sed 's/regexp/\n&/g'
 

Ceci remplace par newline:

 sed "s/regexp/\\`echo -e '\n\r'`/g"
 

15voto

vivek Points 41
echo one,two,three | sed 's/,/\
/g'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X