Comment «cat» un fichier et supprimer des lignes commentées?


29

Je voudrais savoir s'il existe un moyen de catdéposer php.iniet de supprimer toutes les lignes commençant par;

Par exemple, si le fichier contient ceci:

;   - 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

et j'ai exécuté la commande correcte cat | {remove comments command}, puis je me retrouverais avec:

error_reporting  =  E_ALL & ~E_NOTICE

Note - Je suppose que catce serait la meilleure façon de le faire , mais je suis en fait très bien avec la réponse en utilisant un autre utilitaire comme awk, sed, egrep, etc.


Et quelque chose comme ça error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? Le commentaire devrait-il également être supprimé dans ce cas?
un CVn

@ MichaelKjörling - Je suis vraiment bien avec seulement les lignes commençant par les commentaires supprimés
cwd

1
catest l'outil pour concaténer des fichiers. grepest l'outil pour filtrer les lignes en fonction des motifs. sedet awkpeut également modifier ces lignes.
Stéphane Chazelas

Réponses:



25

Vous n'avez pas besoin de diriger un fichier via grep, grep prend les noms de fichiers comme arguments de ligne de commande.

grep -v '^#' file1 file2 file3

affichera toutes les lignes SAUF celles qui commencent par un # char. vous pouvez changer le caractère de commentaire comme vous le souhaitez.

Si vous avez plus d'un caractère de commentaire (en supposant que ce soit au début d'une ligne)

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

2
Un autre que j'ai fait et qui est toujours resté avec moi était grep '^[^;]' filename. Je ne peux pas parler de sa portabilité!
Jodie C

@JodieC, c'est portable mais supprime également les lignes vides (ce qui est souvent souhaité). L'équivalent standard de egrepest grep -E. On peut aussi utilisergrep -ve '^[;#]' -e '^//'
Stéphane Chazelas

9

egreppeut vous faire économiser l'utilisation de cat. En d'autres termes, créez moins de processus ( egrepvs cat+ egrep) et utilisez moins de tampons (pipe de catvers egrepvs no pipe).

C'est généralement une bonne idée de limiter l'utilisation de catsi vous voulez simplement passer un fichier à une commande qui peut le lire seul.

Cela dit, la commande suivante supprimera les commentaires, même s'ils sont en retrait avec des espaces ou des tabulations:

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

C'est drôle que vous combiniez le format regex de [[ classe de caractères plus récent ]]avec l'utilisation de la egrepcommande déconseillée depuis au moins une décennie.
mikeserv

Intéressant ... les documents actuels sur gnu.org/software/grep/manual/html_node/… incluent les classes POSIX.
Jack Wasey

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

cela exclura les lignes commençant par le «;» et les lignes vides.

en regex, ^indique le début d'une ligne et $la fin d'une ligne, ^$spécifie donc les lignes où le caractère de début de ligne et le caractère de fin de ligne sont l'un à côté de l'autre.


donc si je lis bien, cela peut supprimer les lignes commentées, mais aussi les lignes vides?
cwd

1
@cwd Oui. Je ne sais pas pourquoi il a inclus les deux, mais si vous voulez seulement supprimer les lignes commentées, utilisez simplementegrep -v '^;'
Michael Mrozek

4
egrep aime aussi les fichiers (moins de processus et de tampons utilisés), et un petit bonus serait de supprimer aussi les commentaires en retrait:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
Nous avons besoin d'un badge "utilisation inutile du chat".
Simon Richter

@nrolans - ressemble à un commentaire populaire, pourquoi ne pas en faire une réponse?
cwd

2

Une simple awkdoublure awk '/^;/{next}1' input_filedevrait faire l'affaire.

[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
Correct, mais verbeux. C'est juste awk '!/^;/' input_fileassez.
manatwork

2

En plus de Jaypal, j'utiliserais très probablement awkà ces fins. Il est pire de mentionner que perl est parfois très pratique à de telles fins:

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

Les expressions rationnelles de Perl sont plus puissantes que celles de awk et parfois vous pourriez en avoir besoin.


+1 pour perl, bien que le chat et le -l soient tous deux redondants, donc une invocation plus simple estperl -ne 'print unless /^;/' data.txt
Simon Whitaker

@Simone Whitaker, oui, vous avez raison - c'est juste une habitude de l'écrire comme j'écris, et cela vaut la peine de le mentionner.
shabunc

1
Chose sûre. En fait, je pense que cela catfonctionne très bien dans ces exemples si vous le considérez comme un proxy pour le plus générique "tout ce qui génère du texte sur STDOUT". Les tuyaux Unix sont la meilleure chose depuis le pain en tranches, à mon humble avis. :)
Simon Whitaker

2

Une élaboration sur la réponse de @ shabunc, qui utilise Perl pour supprimer les commentaires (y compris les commentaires en ligne), puis imprimer toutes les lignes contenant autre chose que des espaces.

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

Explication:

  • s/;.*//utilise l'opérateur de substitution ( s/<regex>/<replacement>/) pour remplacer les instances d'un point-virgule et tout ce qui le suit sur une ligne avec la chaîne vide.
  • print if /\S/affiche la ligne si elle correspond à l'expression rationnelle \S, qui est une classe de caractères correspondant à tous les caractères non blancs.

1

En voici une que j'utilise, remplacez simplement ';' avec le caractère de commentaire (par exemple '#' pour de nombreux fichiers de configuration de service UNIX):

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

Cela supprime tous les commentaires sur la ligne entière (même s'ils ont des espaces en tête) et tous les commentaires qui terminent les lignes sans commentaire, et supprime également les lignes vides de la sortie. Cela peut être possible sans le pipeline (mon sed- ou awk-fu n'est certes pas génial), mais c'est si facile pour moi de comprendre (et de me souvenir), j'ai pensé que je le posterais ici.


1

Exemple afficher uniquement les lignes + ne pas afficher les nouvelles lignes ou les lignes vides:

$ 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 

OU

$ 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'utilisation de egrepest obsolète depuis longtemps. grep -Eest la commande que vous recherchez ici.
mikeserv

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

Supprime tous les commentaires et les lignes vides du fichier.txt


2
Vous devriez envisager d'élargir votre réponse avec un peu plus d'informations pour les non-initiés (par exemple, exactement ce que fait l'expression régulière que vous utilisez).
HalosGhost

egrepest amorti. Utilisez grep -Evplutôt.
Yokai


0

vous pouvez utiliser la commande suivante pour enregistrer les lignes, à l'exclusion des lignes vides et des lignes commençant par # dans un nouveau fichier

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


Inutile catPipe et egrepest dépréciée et à remplacer par grep -Edes expressions étendues ou tout simplement grep -v.
Yokai
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.