Per dare STDIN per Sed?

1

Pseudocommand

echo '1,2,3,5' | sed -n data.txt

che dà

sed: 1: "data.txt": extra characters at the end of d command

Voglio dare ai lenzuoli la ricerca da altri comandi. In realtà awk sta dando quei numeri da questa discussione .

data.txt:

hello 
amigo
this line 3
and here we go 4
and 5 is here

dove l'output dovrebbe essere

hello 
amigo
this line 3
and 5 is here

Come puoi dare a quei lenzuoli?

    
posta Léo Léopold Hertz 준영 15.06.2015 - 15:33
fonte

3 risposte

3

In pratica puoi fare qualcosa di simile

eval $(echo sed $(for i in 1 2 3 5; do echo "-e ${i}p"; done) -n data.txt )

Per leggere i numeri di riga da un file contenente i numeri, separati da spazio, utilizzare

eval $(echo sed $(for i in $(< line-numbers.txt); do echo "-e ${i}p"; done) -n data.txt )

In questo caso, puoi utilizzare il comando qualsiasi che produce un elenco di numeri di riga invece della parte < line-numbers.txt .

Oppure, se i numeri nel file sono separati da ,

eval $(echo sed $(for i in $(tr \, ' ' < line-numbers.txt); do echo "-e ${i}p"; done) -n data.txt )

(e di nuovo, il comando può essere qualsiasi cosa che generi numeri di linea separati da , )

    
risposta data 15.06.2015 - 15:48
fonte
1

Un altro modo sta usando sed con xargs .

echo '1p;2p;3p;5p' filename | xargs sed -n

Fondamentalmente sed utilizza il formato <line-number>p per visualizzare una linea. Puoi separare più righe utilizzando ; .

    
risposta data 15.06.2015 - 18:19
fonte
1

Supponendo che l'output del tuo comando awk sia 1,2,3,5 , puoi fare ciò:

sed -n $(my_awk_commamd | sed 's/,/p;/g;s/$/p;/') data.txt

Il sed all'interno della sostituzione del comando $( converte 1,2,3,5 nell'espressione sed 1p;2p;3p;5p; , che viene quindi interpretata dall'outer sed sul file di dati.

Un test unitario, che sostituisce awk con un semplice echo :

$ sed -n $(echo '1,2,3,5' | sed 's/,/p;/g;s/$/p;/') data.txt 
hello 
amigo
this line 3
and 5 is here
$
    
risposta data 15.06.2015 - 19:46
fonte

Leggi altre domande sui tag