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 r
comando 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 sed
interpreteranno 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 r
cui lo fa e sed
lo applicherà e lo r
farà nell'ordine in cui sono stati scritti. Tuttavia è un po 'più coinvolto: implica l'utilizzo di uno sed
per a
sospendere la Pointer
corrispondenza all'output di un altro sed
nel 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 sed
scrive il secondo sed
uno script, che il secondo sed
legge sullo standard input (forse ...) e applica a sua volta. Il primo sed
funziona solo sulla prima corrispondenza per Pointer
found, e successivamente utilizza l' q
input. Il suo compito è ...
s/[]^$&\./*[]/\\&/g;H
- Assicurati che tutti i caratteri del modello siano salvati in modo sicuro con il backslash perché il secondo
sed
dovrà interpretare ogni bit che legge alla lettera per farlo bene. Una volta fatto, mettine una copia nel H
vecchio spazio.
s|.*|/&/!p;//!d|p; x
- Di 'al secondo
sed
di p
stampare tutte le linee di input !
tranne /&/
quella che abbiamo appena protetto dal modello; e poi per d
eliminare tutti uguali. p
stampare i comandi al secondo sed
, quindi x
cambiare i h
buffer vecchi e di pattern per lavorare sulla nostra copia salvata.
s|.|r file1&a\\&|p;q
- L'unico carattere con cui lavoriamo qui è una
\n
ewline perché sed
ne abbiamo anteposto uno prima H
della riga precedente. Quindi inseriamo il comando r file1
e lo seguiamo con la nostra \n
ewline quindi il comando a\\
per a
ppend seguito anche da una \n
ewline. Tutto il resto della nostra H
linea eld segue l'ultima \n
ewline.
Lo script che il primo scrive è simile al seguente:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Fondamentalmente il secondo sed
stamperà ogni riga, ma il primo lo sed
imposta su a
ppend. 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.r
file1
sed
Comunque, quindi ... ci sono alcuni modi.