Lesen Zeilen in einer Datei und die Vermeidung von Zeilen, die mit # in Bash
Habe ich versucht, dieses:
file="myfile"
while read -r line
do
[[ $line = \#* ]] && continue
"address=\$line\127.0.0.1"
done < "$file"
Dieser code kann nicht verhindern, dass die Zeilen, die beginnen mit Kommentaren. Auch wenn ich nicht alle Kommentare, dnsmasq
sagt, dass es Fehler.
Sein wird, eine dnsmasq
conf-Datei, und es wird gelesen und insert domain-Namen, etwa so: address=\mydomain.com\127.0.0.1
.
BEARBEITEN:1
Input-Datei:
domain1.com
domain2.com
domain3.com
#domain4.com
domain5.com
Ausgabe sollte sein:
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
Werde ich fallen das Skript in /etc/dnsmasq.d/ Verzeichnis, so dass dnsmaq.conf verarbeiten können, wenn dnsmasq
gestartet wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist sicherer, zu verwenden
[[ "$line" = "\#*" ]]
Btw
address="\\${line}\\127.0.0.1"
UPD:
Wenn ich habe, verstehen Sie Recht, was Sie ändern jede unkommentierte domains
address=\domain\127.0.0.1
. Es könnte getan werden, schnell und einfach mitsed
gibt es keine Notwendigkeit in der bash-Programm.Wenn Sie brauchen, um zu entfernen auskommentierte Zeilen, sed können es auch tun mit
/matched_line/d
UPD2: wenn Sie wollen, dass alle Sachen innerhalb der bash-Skript, hier ist deine code-änderungen:
Und es ist Ausgabe:
address=
ist nicht eine variable. Seine eine Zeichenfolge, die bekommen sollte, wiederholt sich in allen Linien.repeated
? Sie ersetzen möchten, und alle Zeilen wie #* mitaddress=\${line}\127.0.0.1
?[[ "$line" = "#"* ]]
. Möglicherweise gibt es eine Diskrepanz zwischen Systemen / Versionen.Überspringen Linien ab mit
#
:Ändern Sie die
grep
Befehl wie nötig, um zum Beispiel Zeilen auslassen, die anfangen mit Leerzeichen und ein#
Charakter.while IFS= read -r TI; do echo "${TI}"; done < <(grep -v '#' ./items)
Nur eine funktionierende für mich war:
Kommentarzeilen können, und oft tun, beginnen Sie mit Leerzeichen. Hier ist ein bash-native regex-Lösung, mit der alle vorausgehenden Leerzeichen;
Diese nimmt einen string, wird der Teilstring an offset 0 Länge 1:
und prüft, ob es gleich
#
und weiter looping, wenn so
http://www.tldp.org/LDP/abs/html/string-manipulation.html
Können Sie filter mit
awk
:Dies könnte auch dadurch erreicht werden, mit 1
sed
Befehl:Dies ändern wird die Datei in-place (erstellen einer backup-Kopie der ersten), entfernen Sie alle Zeilen, beginnend mit einer
#
.Vielleicht können Sie versuchen,
Überprüfen Sie die
~
im Operanden!Es hat 3 Teile. Bitte Lesen Sie die einzelnen, klar zu verstehen,
awk -F'#' '{print $1}' t.txt
awk 'NF > 0'
awk '{print "address=/"$0"/127.0.0.1"}'
Also Insgesamt Script Notwendig ist,
Ausgabe :