Prefisso e suffisso le stringhe per ciascuna riga di output dal comando


17

Ho riscontrato un problema durante il tentativo di scrivere uno script Bash. Quando viene grepemesso, restituisce (di solito) molte righe. Vorrei aggiungere il prefisso e il suffisso a una stringa per ciascuna di queste linee di output.

Vorrei anche notare che sto eseguendo il piping lsin grep, come:

ls | grep

2
Non dovresti analizzare ls- è un cattivo juju. Inoltre, deve essere grep? E puoi dare qualche esempio di output?
Sobrique,

1
Cosa vuoi che faccia lo script se il nome file contiene una nuova riga?
Tai Viinikka,

Risposte:


27

Con sed:

ls | grep txt | sed 's/.*/prefix&suffix/'

3
Oppure, sedessendo un superset di grep: ls | sed -n '/txt/s/.*/prefix&suffix/p'oppurels | sed -n 's/.*txt.*/prefix&suffix/p'
Stéphane Chazelas il

@ StéphaneChazelas: Grazie per questo suggerimento.
Cyrus,

5

Con sed:

ls | grep pattern | sed -e 's/^/prefix/' -e 's/$/suffix/'

Ma nota, questo soffre di problemi con i nomi di file con feed di riga e tutti i problemi assortiti di analisi lsche è generalmente una cattiva idea.

Con perl

perl -e 'print "prefix".$_."suffix\n" for grep { m/somepattern/} glob "*"'

Nota: perl greppuò prendere un modello, come il grepcomando, ma puoi anche fare cose come applicare test di file.

Per esempio

grep {-d} glob "*" #filters directories.
grep { (stat)[9] > time() - 60 } glob "*" #reads file mtime and compares. 

All'interno grepdell'iteratore predefinito $_è impostato il valore dell'elemento corrente, quindi è possibile applicare sed/ grepstyle regex o eseguire una varietà di attività basate su $_.


Come includerei una variabile come suffisso / prefisso nel tuo primo esempio usando ´sed´?
SpecialBomb,

Cambia le virgolette in e basta usarle.
Sobrique,

2

In questo caso GNU findti consente di fare tutte queste cose in una volta sola, eliminando le pipe e l'analisi potenzialmente problematica di ls:

find . -maxdepth 1 -name '[^.]*' \
  -regextype posix-extended -regex "MYPATTERN" \
  -printf 'SOMEPREFIX %f SOMESUFFIX\n'

( findovviamente non è un buon modo per modificare arbitrariamente l'output di altri comandi!)

Alcune note:

  • -maxdepth 1e -name [^.]*far corrispondere il nome allo stesso modo di un semplice ls(o ls .). Puoi usare qualsiasi glob in stile shell, ma nota che "*" corrisponderà a un "" iniziale. in un nome † a differenza bash, quindi [^.]*significa tutto ciò che non ha un "".
  • MYPATTERN è un ERE POSIX corretto (il tipo predefinito è Emacs, vedi qui ), ma deve corrispondere all'intero nome file quindi usa qualcosa di simile .*thing.*invece dithing
  • probabilmente puoi semplicemente usare uno di -name/ -regexanziché entrambi (ad esempio -regex "[^.]. MYPATTERN. "
  • -printfsupporta molte cose , %nè il file disadorno o il nome della directory

(questo può dipendere dalla tua versione di find, controlla la sezione "CONFORMITÀ STANDARD" della tua pagina man)

Come possibile alternativa senza programmi esterni richiesti, bashha compgenche, tra le altre cose, espande globs, equivalente a un lssenza opzioni:

compgen -P "someprefix>" -S "<somesuffix" -G "pattern"

Gestisce i nomi di file con spazi bianchi, comprese le nuove righe. compgen -G "*"dovrebbe fornire lo stesso output di un semplice ls(ma nota che ls *è una cosa completamente diversa). Avrai ancora bisogno grep, e questo può o non può risolvere il problema, ma vale la pena una menzione.


0

sede le findsoluzioni vengono messe alla prova se il prefisso / suffisso include caratteri chiave regex o se si desidera passare una variabile di ambiente (anziché un valore immediato), xargs+ echopotrebbe essere più appropriato qui.

Con variabile d'ambiente:

ls | grep p | xargs -I % sh -c "echo $PATH/%"

Con un inline:

ls | grep p | xargs -I % sh -c "echo `pwd`/%"
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.