Come faccio a far leggere a sed dallo standard input? [duplicare]


91

sto provando

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'

e ottenere

unknown option to `s'

Che cosa sto facendo di sbagliato?

Modificare:

Secondo i commenti, il codice è effettivamente corretto. Il mio codice completo era simile al seguente

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'
# my comment

E sembra che per qualche motivo il mio commento sia stato inserito come input in sed. Molto strano.


Vuoi sostituire il tuo file con "withthis" al posto di replacename?
Teja

2
No, non è quello che stai cercando. Manca qualcos'altro.
Ignacio Vazquez-Abrams

6
La mia ipotesi migliore è che nel tuo caso reale tu abbia un /in replacemeo withthis. Prova: 's#replaceme#withthis#g'.
cababunga

4
Una cosa che stai sbagliando è non mostrarci esattamente cosa stai eseguendo. Il codice mostrato va bene; hai un problema con quello che stai eseguendo; ergo, non ci stai mostrando cosa stai eseguendo. Non possiamo eseguire il debug di ciò che non possiamo vedere, la maggior parte delle volte. A volte, saremo fortunati e indovineremo bene, ma non dovremmo dover indovinare o essere fortunati.
Jonathan Leffler

1
Uso inutile di grep. Con sed, puoi fare: sed '/ searchterm / s / pattern / replacement / g' myfile.csv
William Pursell

Risposte:


121

usa l'opzione --expression

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'

+ SOaddict, questo è solo l'output in stdout, non cambia il myfile.csv.
Josiah

1
Se desideri eseguire un aggiornamento sul posto del file, penso che la mia risposta risolva adeguatamente il problema.
Wes

Tutto ciò che sembra grep 'x' y | sed 'z'può essere refactored sed '/x/z' y. Vedi anche uso inutile di grep.
tripla

40

usa "-e" per specificare l'espressione sed

cat input.txt | sed -e 's/foo/bar/g'

1
Mi chiedevo come usare "-e" per specificare l'espressione sed può far leggere a sed da stdin? Di default sed legge da stdin?
Tim

1
sì. come la maggior parte degli strumenti un * x, sedlegge da stdin se non è presente alcun file di input.
umläute

Grazie. è -enecessario? Funziona senza -e. Mi chiedo qual è lo scopo dell'utilizzo -e? Grazie.
Tim

2
Non sono sicuro di aver capito la questione dell'OP. echo foo | sed 's/foo/bar/g'funziona senza -e, producendo bar. Quindi devo aver perso la sua domanda.
Tim

Non è necessario specificare -ese si dispone di una sola istruzione di script. Se ne hai due, puoi dire sed -e '/foo/!d' -e 's//bar/g'o sed 's/foo!d;s//bar/g'(o equivalentemente, con una nuova riga invece di un punto e virgola).
tripla

6

Per sedcatturare da stdin, invece che da un file, dovresti usare -e.

Come questo:

curl -k -u admin:admin https://$HOSTNAME:9070/api/tm/3.8/status/$HOSTNAME/statistics/traffic_ips/trafc_ip/ | sed -e 's/["{}]//g' |sed -e 's/[]]//g' |sed -e 's/[\[]//g' |awk  'BEGIN{FS=":"} {print $4}'

2

Se stai cercando di eseguire un aggiornamento sul posto del testo all'interno di un file, questo è molto più facile da ragionare nella mia mente.

grep -Rl text_to_find directory_to_search 2>/dev/null | while read line; do  sed -i 's/text_to_find/replacement_text/g' $line; done


-17
  1. Apri il file usando vi myfile.csv
  2. stampa Escape
  3. genere :%s/replaceme/withthis/
  4. Digita :wqe premiEnter

Ora avrai il nuovo modello nel tuo file.


11
OP voleva sapere come farlo con sed, non con vim.
Noe Nieto

1
Quello che ha detto Noe. Inoltre, la tua soluzione vim è inferiore alle alternative sed in quanto non è (facilmente) scriptabile.
weberc2
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.