[英]Reading lines in a file and avoiding lines with # with Bash
我试过这个:
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
。
输入文件:
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
时处理它。
要跳过以#
开头的行:
grep -v '^#' myfile | while read -r file ; do
...
done
根据需要修改grep
命令,例如,跳过以空格和#
字符开头的行。
使用[[ "$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
只有一个为我工作的是:
while IFS=$'\n' read line
do
if [[ "$line" =~ \#.* ]];then
logDebug "comment line:$line"
else
logDebug "normal line:$line"
fi
done < myFile
注释行可以并且通常以空格开头。 这是一个bash本地正则表达式解决方案,可以处理任何前面的空格;
while read line; do
[[ "$line" =~ ^[[:space:]]*# ]] && continue
...work with valid line...
done
[ "${line:0:1}" = "#" ] && continue
"${line:0:1}"
并检查它是否等于#
= "#"
并继续循环,如果是这样
&& continue
你可以用awk
过滤:
awk '!/^#/{print"address=/"$0"/127.0.0.1"}' file
这也可以使用1 sed
命令完成:
file="myfile"
sed -i".backup" 's/^#.*$//' $file
这将就地修改文件(首先创建备份副本),删除以#
开头的所有行。
awk '{ if ($0 !~ /^#/){printf "address=/%s/127.0.0.1 \n",$0}}' <your_input_file>
它有3个部分。 请阅读每个清楚了解
awk -F'#' '{print $1}' t.txt
----- awk -F'#' '{print $1}' t.txt
awk 'NF > 0'
创建的空行 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
也许你可以试试
[[ "$line"~="#.*" ]] && continue
检查~
操作数!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.