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é.
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
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.
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
[ "${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
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
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 #
.
Vous pouvez filtrer par awk
:
awk '!/^#/{print"address=/""/127.0.0.1"}' file
Peut-être que vous pouvez essayer
[[ "$line"~="#.*" ]] && continue
Case ~
dans l'opérande!
awk '{ if ( !~ /^#/){printf "address=/%s/127.0.0.1 \n",}}' <your_input_file>
il a 3 parties. Veuillez lire chacun de comprendre clairement
- Pour supprimer # ligne -----
awk -F'#' '{print }' t.txt
- Pour supprimer une ligne vide créé par # ----
awk 'NF > 0'
- à 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