Prefisso tutte le righe con la prima parola in un file


3

Voglio aggiungere il prefisso a tutte le righe di un file (tranne la prima riga) usando la prima parola in un file.

Ingresso:

x.o: x.cpp /u/a.h 
/b.h \
/c.h \

produzione:

x.o: x.cpp /u/a.h \
x.o: /b.h \
x.o: /c.h \

Qualcuno può aiutarmi per favore come risolvere quanto sopra usando sed?

Risposte:


3

Puoi farlo in questo modo con GNU sed:

sed -r '1 {h; s/ .*//; x}; 1!{G; s/([^\n]*)\n(.*)/\2 \1/}' infile

O come uno script separato:

parse.sed

1 {                         # run block for first line only
  h                         # save copy of line in hold space
  s/ .*//                   # remove redundant part
  x                         # swap prefix to hold space
}

1! {                        # when not first line
  G                         # append prefix to pattern space
  s/([^\n]*)\n(.*)/\2 \1/   # reorganize so prefix is the prefix
}

Eseguilo in questo modo:

 sed -rf parse.sed infile

Produzione:

x.o: x.cpp /u/a.h 
x.o: /b.h \
x.o: /c.h \

+1 Sono sempre impressionato dagli script sed non banali.
Glenn Jackman,

2

Soluzione Perl:

perl -pe 'print $prefix; ($prefix) = /^(.+? )/ if 1..1' INPUT.TXT

grazie. Non sono sicuro di poter usare la soluzione sopra in un makefile. Voglio usare il comando sed per ottenere sopra.
Naga,

@Naga, non c'è niente di magico nel sed in un makefile. perl (o awk o ...) è solo uno strumento esterno come sed.
Glenn Jackman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.