web-dev-qa-db-fra.com

Lire des lignes dans un fichier et éviter les lignes avec # avec Bash

J'ai essayé ceci:

file="myfile"
while read -r line
do
    [[ $line = \#* ]] && continue
    "address=\$line\127.0.0.1"
done < "$file"

Ce code n'évite pas les lignes commençant par des commentaires. Même si je n'ai pas de commentaires, dnsmasq indique qu'il y a des erreurs.

Son va être un fichier de conf dnsmasq, et il va lire et insérer des noms de domaine comme suit: address=\mydomain.com\127.0.0.1.


EDIT: 1

Fichier d'entrée:

domain1.com
domain2.com
domain3.com
#domain4.com
domain5.com

La sortie devrait être:

address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
address=/domain5.com/127.0.0.1

Je déposerai le script dans le répertoire /etc/dnsmasq.d/ de sorte que dnsmaq.conf puisse le traiter lorsque dnsmasq est démarré.

17
nixnotwin

Il est plus sûr d'utiliser [[ "$line" = "\#*" ]]

Btw, address="\\${line}\\127.0.0.1"

UPD:

Si je vous ai bien compris, vous devez changer tous les domaines non commentés en address=\domain\127.0.0.1. Cela pourrait être fait rapidement et facilement avec sed, il n'y a aucun besoin dans bash-programme.

$> cat ./text
domain1.com
domain2.com
domain3.com
#domain4.com
domain5.com

$> sed -r -e 's/(^[^#]*$)/address=\/\1\/127.0.0.1/g' ./text2
address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
#domain4.com
address=/domain5.com/127.0.0.1

Si vous avez besoin de supprimer les lignes commentées, sed peut le faire aussi avec /matched_line/d

$> sed -r -e 's/(^[^#]*$)/address=\/\1\/127.0.0.1/g; /^#.*$/d' ./text2 
address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
address=/domain5.com/127.0.0.1

UPD2 : si vous voulez faire tout ça dans le script bash, voici la modification de votre code:

file="./text2"
while read -r line; do
    [[ "$line" =~ ^#.*$ ]] && continue
    echo "address=/${line}/127.0.0.1"
done < "$file"

Et c'est la sortie:

address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
address=/domain5.com/127.0.0.1

Pour ignorer les lignes commençant par avec #:

grep -v '^#' myfile | while read -r file ; do
    ...
done

Modifiez la commande grep si nécessaire pour, par exemple, ignorer les lignes commençant par des espaces et un caractère #.

27
Keith Thompson

Un seul travaillait pour moi:

while IFS=$'\n' read line
do  
    if [[ "$line" =~ \#.* ]];then
        logDebug "comment line:$line"
    else
        logDebug "normal line:$line"
    fi
done < myFile
4
Pipo

Les lignes de commentaires peuvent et commencent souvent par des espaces. Voici une solution bash regex native qui gère tous les espaces précédents;

while read line; do
  [[ "$line" =~ ^[[:space:]]*# ]] && continue
  ...work with valid line...
done
3
briceburg
[ "${line:0:1}" = "#" ] && continue

Ceci prend la chaîne, obtient la sous-chaîne à offset 0, longueur 1 :

"${line:0:1}"

et vérifie s'il est égal à #

= "#"

et continue en boucle si oui

&& continue

http://www.tldp.org/LDP/abs/html/string-manipulation.html

3

Vous pouvez filtrer avec awk:

awk '!/^#/{print"address=/"$0"/127.0.0.1"}' file
2
Claes Wikner

Cela pourrait également être accompli avec 1 sed commande:

file="myfile"

sed -i".backup" 's/^#.*$//' $file

Cela modifiera le fichier sur place (en créant d'abord une copie de sauvegarde), en supprimant toutes les lignes commençant par #.

1
chown

Il a 3 parties. S'il vous plaît lire chacun pour comprendre clairement

  1. Pour supprimer # line ----- awk -F'#' '{print $1}' t.txt 
  2. Pour supprimer une ligne vide créée par # ----awk 'NF > 0' 
  3. Pour imprimer dans le format requis. ------awk '{print "address=/"$0"/127.0.0.1"}'

Donc Total Script Needed est,

**awk -F'#' '{print $1}' t.txt | awk 'NF > 0' | awk '{print "address=/"$0"/127.0.0.1"}'**

Sortie: 

address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
address=/domain5.com/127.0.0.1
0
Abhi km

Peut-être que vous pouvez essayer

[[ "$line"~="#.*" ]] && continue

Vérifiez le ~ dans l'opérande!

0
uzsolt
awk '{ if ($0 !~ /^#/){printf "address=/%s/127.0.0.1 \n",$0}}' <your_input_file>
0
louie_45