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
.
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é.
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 #
.
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
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
[ "${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
Vous pouvez filtrer avec awk
:
awk '!/^#/{print"address=/"$0"/127.0.0.1"}' file
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 #
.
Il a 3 parties. S'il vous plaît lire chacun pour comprendre clairement
awk -F'#' '{print $1}' t.txt
awk 'NF > 0'
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
Peut-être que vous pouvez essayer
[[ "$line"~="#.*" ]] && continue
Vérifiez le ~
dans l'opérande!
awk '{ if ($0 !~ /^#/){printf "address=/%s/127.0.0.1 \n",$0}}' <your_input_file>