Regex 当读取超出范围的行时

Regex 当读取超出范围的行时,regex,sed,while-loop,Regex,Sed,While Loop,我用几个参数调用脚本。第一个参数,例如4011,是我正在输入文件中搜索的字符串。从那以后,我只删除所有以“;”开头的行,直到找到模式“[.*]”上的下一个匹配项 但似乎下一个“;”行也会在下一个匹配中删除,例如[4012] 对如何修复我的代码有什么建议吗 #!/bin/bash sip="/Desktop/template/test.conf" extension=$1 prov=$2 useragent=$3 dest=$4 mac=$5 name=$6 startline=$(grep -

我用几个参数调用脚本。第一个参数,例如
4011
,是我正在输入文件中搜索的字符串。从那以后,我只删除所有以“;”开头的行,直到找到模式“[.*]”上的下一个匹配项

但似乎下一个“;”行也会在下一个匹配中删除,例如
[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
found=0
读行时;做
如果grep“\['”$1“\]”;然后
转移
发现=1
elif grep“\[.\]”;然后
找到=0
elif[$found-等式1];然后
回显“$line”| sed的/^;*$/”>>/tmp/$$
其他的
回显“$line”>>/tmp/$$
fi
完成<“$file”
mv/tmp/$$“$文件”

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

就我而言,这是一种非常接近.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的两部分组成,其中一个管道连接

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


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

找到与正则表达式匹配的行号,以便将其传递给已经理解正则表达式的工具,这是一个糟糕的反模式。无论如何,您的整个脚本可能都可以用一个简单的
sed
脚本来重新表述。谢谢您提供的所有答案@tripleee:现在我有了一个运行sed-i'/[4012]/,/[.]/{/\;/d}'test.conf的单行程序。谢谢,您的解决方案运行得很好。昨天我找到了我自己的sed脚本sed-i'/['“$1”]/,/[.]/{/\;/d},tripleee为我指明了正确的方向,让我通过一个小sed来完成所有事情,正如你提到的那样script@calabash请注意,您的代码很危险。它可以进行就地修改。希望你打算这么做
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