Ci sono alcuni modi per procedere con questo sed. Un modo è una lettura ritardata come raccomandato nella risposta accettata. Potrebbe anche essere scritto come:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... con un po 'di look-forward esplicito anziché il look-behind implementato altrove con il buffer di conservazione. Che inevitabilmente hanno lo stesso problema con l'ultima riga che le note @don_crissti, però, perché N fa di incremento del ciclo di linea e il rcomando di EAD è applicata in base al numero di linea.
Puoi aggirarlo:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Non tutti sedinterpreteranno il -significato di input standard, ma molti lo fanno. ( POSIX dice che sed dovrebbe supportare -significare standard-in se l'implementatore vuole -dire standard-in ???)
Un altro modo è gestire il contenuto allegato in ordine. C'è un altro comando che pianifica l' output nello stesso modo in rcui lo fa e sedlo applicherà e lo rfarà nell'ordine in cui sono stati scritti. Tuttavia è un po 'più coinvolto: implica l'utilizzo di uno sedper asospendere la Pointercorrispondenza all'output di un altro sednel suo script.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Quindi sostanzialmente il primo sedscrive il secondo seduno script, che il secondo sedlegge sullo standard input (forse ...) e applica a sua volta. Il primo sedfunziona solo sulla prima corrispondenza per Pointerfound, e successivamente utilizza l' qinput. Il suo compito è ...
s/[]^$&\./*[]/\\&/g;H
- Assicurati che tutti i caratteri del modello siano salvati in modo sicuro con il backslash perché il secondo
seddovrà interpretare ogni bit che legge alla lettera per farlo bene. Una volta fatto, mettine una copia nel Hvecchio spazio.
s|.*|/&/!p;//!d|p; x
- Di 'al secondo
seddi pstampare tutte le linee di input !tranne /&/quella che abbiamo appena protetto dal modello; e poi per deliminare tutti uguali. pstampare i comandi al secondo sed, quindi xcambiare i hbuffer vecchi e di pattern per lavorare sulla nostra copia salvata.
s|.|r file1&a\\&|p;q
- L'unico carattere con cui lavoriamo qui è una
\newline perché sedne abbiamo anteposto uno prima Hdella riga precedente. Quindi inseriamo il comando r file1e lo seguiamo con la nostra \newline quindi il comando a\\per append seguito anche da una \newline. Tutto il resto della nostra Hlinea eld segue l'ultima \newline.
Lo script che il primo scrive è simile al seguente:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Fondamentalmente il secondo sedstamperà ogni riga, ma il primo lo sedimposta su append. Per quella particolare riga sono programmate due scritture ritardate in uscita standard : la prima è la prima e la seconda è una copia della riga che vogliamo dopo. Il primo dottorato non è nemmeno necessario in questo caso (vedi? Nessuna barra rovesciata) ma è importante fuggire in modo sicuro come faccio qui ogni volta che un pattern match viene riproposto come input.rfile1sed
Comunque, quindi ... ci sono alcuni modi.