我用几个参数调用脚本。第一个参数,例如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
答案 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的两个部分组成,并连接了一个管道。
第一部分将[]
中的所有文字从指定的代码中获取到下一个[]
。
然后在管道之后,代码删除空行,注释行和[]
行,并输出很好的结果。