读取文件中的行并避免使用带有Bash的行

时间:2011-11-19 17:42:43

标签: bash loops comments

我试过了:

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 个答案:

答案 0 :(得分:27)

使用#

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

根据需要修改grep命令,例如,跳过以空格和#字符开头的行。

答案 1 :(得分:18)

使用[[ "$line" = "\#*" ]]

更安全

顺便说一下,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脚本中执行所有操作,请执行以下代码修改:

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 :(得分:4)

只有一个为我工作的人是:

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

答案 3 :(得分:4)

注释行可以并且经常以空格开头。这是一个bash本地正则表达式解决方案,可以处理任何前面的空格;

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

答案 4 :(得分:3)

[ "${line:0:1}" = "#" ] && continue

这将获取字符串,获取offset 0, length 1处的子字符串:

"${line:0:1}"

并检查它是否等于#

= "#"

并继续循环,如果是这样

&& continue

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

答案 5 :(得分:2)

您可以使用awk进行过滤:

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

答案 6 :(得分:1)

这也可以使用1 sed命令完成:

file="myfile"

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

这将就地修改文件(首先创建备份副本),删除以#开头的所有行。

答案 7 :(得分:0)

也许你可以试试

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

检查操作数中的~

答案 8 :(得分:0)

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

答案 9 :(得分:0)

它有3个部分。请阅读每一个以便清楚地了解

  1. 删除#line ----- awk -F'#' '{print $1}' t.txt
  2. 删除#---- awk 'NF > 0'
  3. 创建的空白行
  4. 以所需格式打印。 ------ awk '{print "address=/"$0"/127.0.0.1"}'
  5. 所需的总脚本是,

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