Чтение строк в файле и избегание строк с помощью # 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
Ответ 4
[ "${line:0:1}" = "#" ] && continue
Это берет строку, получает подстроку в смещение 0, длина 1:
"${line:0:1}"
и проверяет, равен ли он #
= "#"
и продолжает цикл, если так
&& continue
http://www.tldp.org/LDP/abs/html/string-manipulation.html
Ответ 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