web-dev-qa-db-fra.com

Comment puis-je "CAT" un fichier et supprimer des lignes commentées?

J'aimerais savoir s'il y a une façon de pouvoir cat Fichier comme php.ini et supprimer toutes les lignes commençant par ;

Par exemple, si le fichier contenait 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 couru la bonne commande cat | {remove comments command}, alors je finirais avec:

error_reporting  =  E_ALL & ~E_NOTICE

Note - J'ai supposé que cat serait la meilleure façon de le faire, mais je suis en fait bien avec la réponse en utilisant un autre utilitaire comme awk, sed, egrep, etc.

30
cwd

Vous pouvez utiliser:

sed -e '/^;/d' php.ini
33
favadi

egrep peut vous enregistrer l'utilisation de cat. En d'autres termes, créez moins de processus (egrep vs cat + egrep) et utilisez moins de tampons (tuyau de cat à egrep vs pas de tuyau).

Il est généralement judicieux de limiter l'utilisation de cat si vous souhaitez simplement passer un fichier à une commande qui peut le lire seul.

Avec cela, la commande suivante supprimera les commentaires, même s'ils sont indentés avec des espaces ou des onglets:

eGREP -V '^ [[: vide:]] *;' fichier.ini
9
nrolans
egrep -v '^;|^$' $file

cela exclut des lignes qui commencent avec les lignes ';' et des lignes vides.

dans Regex, ^ indique le début d'une ligne et $ la fin d'une ligne, alors ^$ Spécifie des lignes dans lesquelles le caractère de départ de la ligne et le caractère final sont juste à côté de l'autre.

7
Tim Kennedy

Un simple awk one-liner awk '/^;/{next}1' input_file devrait 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] 
2
jaypal singh

Ainsi que Jaypal, je voudrais aussi très probablement utiliser awk à ces fins. Cela pire de mentionner que Perl est parfois assez pratique à ces fins:

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

Perl Regexps sont plus puissants par rapport à l'AWK et parfois, vous pourriez en avoir besoin.

2
shabunc

Une élaboration de la réponse de @ Shabunc, cela utilise Perl pour dépasser des commentaires (y compris les commentaires en ligne), puis imprimer des lignes contenant autre chose que WhitSpace.

$ 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 demi-côon et de tout ce qui suit sur une ligne avec la chaîne vide.
  • print if /\S/ imprime la ligne si elle correspond au Regexp \S, qui est un classe de caractères correspondant à tous les caractères non blancheurs.
2
Simon Whitaker

Voici un que j'utilise, il suffit de substituer ";" Avec le caractère de commentaire (par exemple '#' pour de nombreux fichiers de configuration du service UNIX):

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

Cela se débarrasse de tous les commentaires en ligne (même s'ils ont des principaux espaces), et des commentaires qui mettent fin à des lignes non commentaire, et supprime succinctement les lignes vierges de la production. Cela peut être possible sans le pipeline (mon SED- ou AWK-FU est certes pas génial), mais c'est si facile pour moi de comprendre (et de me souvenir), je pensais que je l'afficherais ici.

1
Trey Blancher

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

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

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

Strips Tous les commentaires et lignes vides de fichier.txt

0
Nikola

Va dépasser les lignes vides aussi

grep -E -v "^\s*($|;)" php.ini
0
Fedir RYKHTIK