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.
Vous pouvez utiliser:
sed -e '/^;/d' php.ini
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
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.
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]
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.
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.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.
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>
egrep -v ^'(#|$)' file.txt
Strips Tous les commentaires et lignes vides de fichier.txt
Va dépasser les lignes vides aussi
grep -E -v "^\s*($|;)" php.ini