Чтение строк в файле и избегание строк с помощью # Bash

Я попробовал это:

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

Этот код не избегает строк, начинающихся с комментариев. Даже если у меня нет комментариев, dnsmasq сообщает, что есть ошибки.

Это будет файл conf dnsmasq, и он будет читать и вставлять доменные имена примерно так: address=\mydomain.com\127.0.0.1.


EDIT: 1

Входной файл:

domain1.com
domain2.com
domain3.com
#domain4.com
domain5.com

Выход должен быть:

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

Я оставлю скрипт в каталоге /etc/dnsmasq.d/, чтобы dnsmaq.conf мог его обработать при запуске dnsmasq.

Ответы

Ответ 1

Безопаснее использовать [[ "$line" = "\#*" ]]

Btw, address="\\${line}\\127.0.0.1"

UPD

Если вы правильно поняли, вам нужно изменить все бездокументарные домены на address=\domain\127.0.0.1. Это можно сделать быстро и легко с помощью sed, нет необходимости в bash -program.

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

Если вам нужно удалить прокомментированные строки, sed также может сделать это с помощью /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: если вы хотите сделать все это внутри bash script, вот ваша модификация кода:

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

И он выводит:

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

Ответ 2

Чтобы пропустить строки, начинающиеся с #:

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

Измените команду grep, если необходимо, например, пропустить строки, начинающиеся с пробелов, и символ #.

Ответ 3

Только один для меня был:

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

Ответ 5

Строки комментариев могут и часто начинаться с пробелов. Здесь bash native regex решение, которое обрабатывает любые предыдущие пробелы;

while read line; do
  [[ "$line" =~ ^[[:space:]]*# ]] && continue
  ...work with valid line...
done

Ответ 6

Это также может быть выполнено с помощью команды 1 sed:

file="myfile"

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

Это изменит файл на месте (сначала создав резервную копию), удалив все строки, начинающиеся с #.

Ответ 7

Вы можете фильтровать с помощью awk:

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

Ответ 8

Возможно, вы можете попробовать

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

Проверьте операнд ~!

Ответ 9

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

Ответ 10

Он состоит из 3 частей. Пожалуйста, прочитайте каждый, чтобы четко понимать.

  • Чтобы удалить # строку ----- awk -F'#' '{print $1}' t.txt
  • Чтобы удалить пустую строку, созданную с помощью # ---- awk 'NF > 0'
  • Печать в требуемом формате. ------ awk '{print "address=/"$0"/127.0.0.1"}'

Итак, Total Script Needed is,

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

Выход:

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