读取行超出范围

时间:2015-06-08 09:02:18

标签: regex sed while-loop

我用几个参数调用脚本。第一个参数,例如4011,是我在输入文件中搜索的字符串。从那以后,我只删除以";"开头的所有行。直到模式的下一场比赛" [。*]"找到了。

但似乎也是下一个&#34 ;;"在下一场比赛中删除线条,例如[4012]

有关如何修复代码的任何建议?

#!/bin/bash
sip="/Desktop/template/test.conf"
extension=$1
prov=$2
useragent=$3
dest=$4
mac=$5
name=$6

startline=$(grep -n "\[$extension\]" $sip | cut -d : -f 1)
startline=$(($startline+1))
echo $startline

while read line
do
    if [[ ! $line =~ \[.*\] ]]
    then
        if [[ $line = \;* ]]
        then
            sed -i "/$line/d" $sip
        fi
    else
        echo "break"
        break
    fi
    echo $line
done < <(tail -n +$startline $sip)

# Comments
match="\[$extension\]"
insert1=";mac="$mac
insert2=";model="$useragent
insert3=";dest="$dest
insert4=";name="$name
sed -i "/$match/a$insert1\n$insert2\n$insert3\n$insert4" $sip

示例输入:

[4002]
sometext
sometext
sometext
sometext
sometext
sometext


[4010]
;mac=aaaaaaaaaaa.xml
;model=spa941
sometext
sometext
sometext
sometext

[4011]
;mac=a44c119fffbe
;model=spa504g
;dest=usmi
;name=1
sometext
sometext
sometext
sometext

[4012]
sometext
sometext
sometext
sometext
sometext
sometext

[4013]
sometext
sometext
sometext
sometext

2 个答案:

答案 0 :(得分:0)

found=0
while read line; do
    if grep "\['"$1"'\]"; then
        shift
        found=1
    elif grep "\[.*\]"; then
        found=0
    elif [ $found -eq 1 ]; then
        echo "$line" | sed 's/^;.*$//' >> /tmp/$$
    else
        echo "$line" >> /tmp/$$
    fi
done < "$file" 
        mv /tmp/$$ "$file"

嗨,这只是一个普遍的想法。我希望它有所帮助,如果你想要那里的[4012 ..]数字,你可以在前两个ifs中添加另一个回声。

答案 1 :(得分:0)

就我而言,这是一种非常接近.ini文件的文本格式。你甚至不需要这么长的bash代码来实现这一目标。让我告诉你我的解决方案:

code=4012
sed -n -e '/^\['"$code"'\]/,/^\[.*\]/p' your_file | sed -e '/^$/d' -e '/^;/d' -e '/^\[.*\]/d'

这是我的结果,上面的文本文件是输入:

$ code=4011
$ sed -n -e '/^\['"$code"'\]/,/^\[.*\]/p' testfile | sed -e '/^$/d' -e '/^;/d' -e '/^\[.*\]/d'
sometext
sometext
sometext
sometext

说明:

该命令由sed的两个部分组成,并连接了一个管道。

第一部分将[]中的所有文字从指定的代码中获取到下一个[]

然后在管道之后,代码删除空行,注释行和[]行,并输出很好的结果。