Come posso "cat" un file e rimuovere le righe commentate?


29

Mi piacerebbe sapere se esiste un modo per catarchiviare come php.inie rimuovere tutte le righe che iniziano con;

Ad esempio, se il file conteneva questo:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

e ho eseguito il comando corretto cat | {remove comments command}, quindi avrei finito con:

error_reporting  =  E_ALL & ~E_NOTICE

Nota - ho pensato che catsarebbe stato il modo migliore per fare questo, ma in realtà sto bene con la risposta utilizzando un altro programma di utilità come awk, sed, egrep, etc.


Che ne dici di qualcosa del genere error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? Il commento dovrebbe essere rimosso anche in quel caso?
un CVn il

@ MichaelKjörling - Sto davvero bene con solo le righe che iniziano con la rimozione dei commenti
cwd

1
catè lo strumento per concatenare i file. grepè lo strumento per filtrare le linee in base ai motivi. sede awkpuò anche modificare quelle righe.
Stéphane Chazelas,

Risposte:



25

Non è necessario reindirizzare un file tramite grep, grep accetta i nomi di file come argomenti della riga di comando.

grep -v '^#' file1 file2 file3

stamperà tutte le righe TRANNE quelle che iniziano con un carattere #. puoi cambiare il carattere del commento come preferisci.

Se hai più di un carattere di commento (supponendo che sia all'inizio di una riga)

egrep -v '^(;|#|//)' filelist

2
Un altro che ho sempre fatto per me è stato grep '^[^;]' filename. Non posso parlare della sua portabilità però!
Jodie C,

@JodieC, che è portatile ma rimuove anche le linee vuote (che è spesso desiderato). L'equivalente standard di egrepè grep -E. Si può anche usaregrep -ve '^[;#]' -e '^//'
Stéphane Chazelas il

9

egreppuò salvarti l'uso di cat. In altre parole, creare meno processi ( egrepvs cat+ egrep) e utilizzare meno buffer (pipe da cata egrepvs no pipe).

In genere è una buona idea limitare l'uso di catse si desidera semplicemente passare un file a un comando in grado di leggerlo da solo.

Detto questo, il seguente comando rimuoverà i commenti, anche se sono rientrati con spazi o tab:

egrep -v '^ [[: blank:]] *;' file.ini

Divertente che tu combini il nuovo formato regex della [[ classe di caratteri ]] con l'uso del egrepcomando deprecato per almeno un decennio o giù di lì.
Mikeserv,

Interessante ... gli attuali documenti su gnu.org/software/grep/manual/html_node/… includono le classi POSIX.
Jack Wasey il

7
egrep -v '^;|^$' $file

ciò escluderà le righe che iniziano con ';' e le righe vuote.

in regex, ^indica l'inizio di una linea e $la fine di una linea, quindi ^$specifica le linee in cui il carattere di inizio della linea e il carattere di fine della linea sono uno accanto all'altro.


quindi se sto leggendo questo diritto questo può rimuovere le righe commentate, ma anche le righe vuote?
Cwd,

1
@cwd Sì. Non sono sicuro del motivo per cui ha incluso entrambi, ma se vuoi solo rimuovere le righe commentate usa semplicementeegrep -v '^;'
Michael Mrozek

4
Ad egrep piacciono anche i file (meno processi e buffer utilizzati) e un piccolo bonus sarebbe anche quello di rimuovere i commenti rientrati:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
Abbiamo bisogno di un badge "uso inutile del gatto".
Simon Richter,

@nrolans: sembra un commento popolare, perché non renderlo una risposta?
Cwd,

2

Un semplice awkone-liner awk '/^;/{next}1' input_filedovrebbe fare il trucco.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
Corretto, ma dettagliato. Basta awk '!/^;/' input_fileè sufficiente.
Manatwork

2

Oltre a Jaypal, probabilmente lo userei anche awkper questi scopi. Peggio ancora menzionare che il perl è a volte abbastanza utile per tali scopi:

cat data.txt | perl -lne "print unless /^;/"

Le regexps del Perl sono più potenti rispetto a quella di Awk e talvolta potresti averne bisogno.


+1 per perl, sebbene il gatto e il -l siano entrambi ridondanti, quindi una semplice invocazione èperl -ne 'print unless /^;/' data.txt
Simon Whitaker,

@Simone Whitaker, sì, hai ragione - è solo un'abitudine scriverlo nel modo in cui scrivo, e vale la pena menzionarlo.
Shabunc,

1
Cosa certa. In effetti, penso catche funzioni bene in questi esempi se lo consideri un proxy per il "generico che genera testo su STDOUT" più generico. Le pipe Unix sono la cosa migliore dopo il pane a fette, imho. :)
Simon Whitaker l'

2

Un'elaborazione sulla risposta di @ shabunc, utilizza Perl per eliminare i commenti (inclusi i commenti incorporati), quindi stampare qualsiasi riga contenente qualcosa di diverso dallo spazio bianco.

$ perl -ne 's/;.*//; print if /\S/' data.txt

Spiegazione:

  • s/;.*//utilizza l'operatore di sostituzione ( s/<regex>/<replacement>/) per sostituire le istanze di un punto e virgola e tutto ciò che lo segue su una riga con la stringa vuota.
  • print if /\S/stampa la linea se corrisponde al regexp \S, che è una classe di caratteri che corrisponde a tutti i caratteri non di spazi bianchi.

1

Eccone uno che uso, basta sostituire ';' con il carattere di commento (ad es. '#' per molti file di configurazione del servizio UNIX):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

Ciò elimina tutti i commenti a linea intera (anche se hanno spazi bianchi iniziali) e tutti i commenti che terminano le righe senza commenti e rimuove in modo succinto anche le righe vuote dall'output. Questo potrebbe essere possibile senza la pipeline (il mio sed- o awk-fu non è certo eccezionale), ma è così facile per me capire (e ricordare), ho pensato di pubblicarlo qui.


1

Esempio mostra solo linee + non mostra nuove linee o linee vuote:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

O

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
L'uso di egrepè a lungo deprecato. grep -Eè il comando che stai cercando qui.
Mikeserv,

0
egrep -v ^'(#|$)' file.txt

Elimina tutti i commenti e le righe vuote da file.txt


2
Dovresti considerare di espandere la tua risposta con un po 'più di informazioni per i non iniziati (ad es. Esattamente ciò che fa la regex che usi).
HalosGhost,

egrepè ammortizzato. Usa grep -Evinvece.
Yokai,


0

è possibile utilizzare il comando seguente per salvare le righe, escludendo le righe vuote e le righe che iniziano con # in un nuovo file

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


catPipa inutile ed egrepè ammortizzata e sostituita con grep -Eespressioni estese o semplicemente grep -v.
Yokai,
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.