Чтение строк в файле и избегание строк с помощью # Bash - PullRequest
20 голосов
/ 19 ноября 2011

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

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

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

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


РЕДАКТИРОВАТЬ: 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.

Ответы [ 10 ]

29 голосов
/ 20 ноября 2011

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

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

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

18 голосов
/ 19 ноября 2011

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

Кстати, address="\\${line}\\127.0.0.1"

UPD :

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

$> 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, вот ваша модификация кода:

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
4 голосов
/ 08 января 2018

Строки комментариев могут и часто начинаются с пробела.Вот собственное решение для регулярных выражений bash, которое обрабатывает любые предшествующие пробелы;

while read line; do
  [[ "$line" =~ ^[[:space:]]*# ]] && continue
  ...work with valid line...
done
4 голосов
/ 07 октября 2013

У меня работал только один:

while IFS=$'\n' read line
do  
    if [[ "$line" =~ \#.* ]];then
        logDebug "comment line:$line"
    else
        logDebug "normal line:$line"
    fi
done < myFile
3 голосов
/ 02 апреля 2017
[ "${line:0:1}" = "#" ] && continue

Принимает строку, получает подстроку с смещением 0, длиной 1 :

"${line:0:1}"

и проверяет, равна ли она #

= "#"

и продолжает цикл, если это так

&& continue

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

2 голосов
/ 14 июля 2015

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

awk '!/^#/{print"address=/"$0"/127.0.0.1"}' file
1 голос
/ 20 ноября 2011

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

file="myfile"

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

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

0 голосов
/ 04 января 2018

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

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

Таким образом, необходимо всего сценарий,

**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
0 голосов
/ 14 июля 2015
awk '{ if ($0 !~ /^#/){printf "address=/%s/127.0.0.1 \n",$0}}' <your_input_file>
0 голосов
/ 20 ноября 2011

Может быть, вы можете попробовать

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...