it-swarm.com.de

Zeilen in einer Datei lesen und Zeilen mit # mit Bash vermeiden

Ich habe das versucht:

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

Dieser Code vermeidet nicht die Zeilen, die mit Kommentaren beginnen. Auch wenn ich keine Kommentare habe, sagt dnsmasq, dass Fehler vorliegen.

Es wird eine dnsmasq conf-Datei sein, und es wird Domänennamen wie folgt gelesen und eingefügt: address=\mydomain.com\127.0.0.1.


EDIT: 1

Eingabedatei:

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

Ich werde das Skript im Verzeichnis /etc/dnsmasq.d/ ablegen, damit dnsmaq.conf es verarbeiten kann, wenn dnsmasq gestartet wird.

17
nixnotwin

Es ist sicherer, [[ "$line" = "\#*" ]] zu verwenden.

Übrigens, address="\\${line}\\127.0.0.1"

UPD:

Wenn ich Sie richtig verstanden habe, müssen Sie alle unkommentierten Domains in address=\domain\127.0.0.1 ändern. Mit sed geht das schnell und einfach, ein bash-Programm ist nicht erforderlich.

$> 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

Wenn Sie kommentierte Zeilen entfernen müssen, kann sed dies auch mit /matched_line/d tun.

$> 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 : Wenn Sie all das innerhalb des Bash-Skripts erledigen möchten, finden Sie hier die Code-Änderung:

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

Und es ist Ausgabe:

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

Zeilen überspringen Beginnen mit #:

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

Ändern Sie den Befehl grep nach Bedarf, um z. B. Zeilen mit Leerzeichen und einem #-Zeichen zu überspringen.

27
Keith Thompson

Nur eine Arbeit für mich war:

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

Kommentarzeilen können und beginnen oft mit Leerzeichen. Hier ist eine bash-native Regex-Lösung, die alle vorhergehenden Whitespaces beherrscht.

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

Dies nimmt den String und erhält den Teilstring bei Offset 0, Länge 1 :

"${line:0:1}"

und prüft, ob es gleich # ist

= "#"

und setzt die Schleife fort, wenn dies der Fall ist

&& continue

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

Sie können mit awk filtern:

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

Dies kann auch mit dem 1 sed-Befehl erreicht werden:

file="myfile"

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

Dadurch wird die Datei vor Ort geändert (eine Sicherungskopie wird zuerst erstellt) und alle Zeilen werden entfernt, die mit einem # beginnen.

1
chown

Es hat 3 Teile. Bitte lest sie jeweils, um sie klar zu verstehen

  1. # Line entfernen ----- awk -F'#' '{print $1}' t.txt 
  2. So entfernen Sie eine leere Zeile, die mit # ---- awk 'NF > 0' erstellt wurde 
  3. So drucken Sie im gewünschten Format. ------awk '{print "address=/"$0"/127.0.0.1"}'

Total Script Needed ist also,

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

Ausgabe : 

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

Vielleicht kannst du es versuchen

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

Überprüfen Sie den ~ im Operanden!

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