Bash: lecture de lignes dans un fichier et éviter les lignes avec #

j'ai essayé ceci:

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

Ce code n'évite pas les lignes qui commencent avec des commentaires. Même si je n'ai pas de commentaires, dnsmasq indique qu'il y a des erreurs.

Sa va être un dnsmasq fichier conf, et il va lire et insérer les noms de domaine comme ceci: address=mydomain.com7.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 vais laisser tomber le script / etc / DN-smasq.d/ répertoire de sorte que dnsmaq.conf peut le traiter lorsque dnsmasq est commencé.

16
demandé sur Jahid 2011-11-19 21:42:43

10 réponses

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 chaque domaine non implémenté en address=\domain7.0.0.1. Il pourrait être fait rapidement et facilement sed, il n'y a pas besoin de bash-program.

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

$> sed -r -e 's/(^[^#]*$)/address=\/\/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 devez supprimer des lignes commentées, sed peut le faire aussi avec /matched_line/d

$> sed -r -e 's/(^[^#]*$)/address=\/\/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 ce genre de choses à l'intérieur de la bash script, voici votre modification de 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
16
répondu ДМИТРИЙ МАЛИКОВ 2011-11-20 09:14:25

Pour sauter des lignes départ#:

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

Modifier grep commande au besoin, par exemple, sauter les lignes commençant par des espaces et un # personnage.

26
répondu Keith Thompson 2011-11-19 21:16:35

un seul qui travaillait pour moi était:

while IFS=$'\n' read line
do  
    if [[ "$line" =~ \#.* ]];then
        logDebug "comment line:$line"
    else
        logDebug "normal line:$line"
    fi
done < myFile
4
répondu Pipo 2015-07-14 03:31:26
[ "${line:0:1}" = "#" ] && continue

cela prend la chaîne, obtient le substrat à décalage 0, longueur 1:

"${line:0:1}"

et vérifie si elle est égale à #

= "#"

et continue en boucle si donc

&& continue

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

3
répondu JoJo Brandon Coffman 2017-04-02 21:05:09

Les lignes de commentaire peuvent et commencent souvent par des espaces. Voici une solution de regex natif de bash qui gère tout espace blanc précedant;

while read line; do
  [[ "$line" =~ ^[[:space:]]*# ]] && continue
  ...work with valid line...
done
3
répondu briceburg 2018-01-08 18:19:09

cela pourrait aussi être accompli avec 1 sed commande:

file="myfile"

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

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

1
répondu chown 2011-11-19 21:56:09

Vous pouvez filtrer par awk:

awk '!/^#/{print"address=/""/127.0.0.1"}' file
1
répondu Claes Wikner 2015-07-15 01:22:09

Peut-être que vous pouvez essayer

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

Case ~ dans l'opérande!

0
répondu uzsolt 2011-11-20 08:09:03
awk '{ if ( !~ /^#/){printf "address=/%s/127.0.0.1 \n",}}' <your_input_file>
0
répondu louie_45 2015-07-14 04:25:42

il a 3 parties. Veuillez lire chacun de comprendre clairement

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

Donc Total Script,

**awk -F'#' '{print }' t.txt | awk 'NF > 0' | awk '{print "address=/""/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
répondu Abhi km 2018-01-04 06:53:07