1、删除匹配字符串的前两行,后一行,可以同时删除多个,循环删除
# 需要删除的字符串数组
deleteArray=("address 192.168.1.12" "address 192.168.1.102" "address 192.168.5.100" "address 192.168.3.201" "address 192.168.6.99" "address 192.168.1.102" "address 192.168.3.88" "address 192.168.5.99")
for value in "${deleteArray[@]}"
do
echo "start to delete \"$value\""
while true
do
# ./interfaces 目标文件
line=$(grep -nE "^$value" ./interfaces | head -1| awk -F ":" '{print$1}') # 目标字符串行号
[ -z "$line" ]&&break # 如果为空,则表示文件中没有该字符串,结束本次循环,继续删除deleteArray 中的下一个字符串
line_start=$((line-2)) # 要删除的起始行
line_end=$((line+1)) #要删除的结束行
echo "delete line:$line_start - $line_end"
# ./interfaces 目标文件
sed -i "$line_start,$line_end d" ./interfaces
done
done
2、删除某个字符串的前几行、后几行,比较灵活
deleteArray(){
value=$1
filename=$4
front=$2
back=$3
line=$(grep -nE "$value" $filename | head -1| awk -F ":" '{print$1}') # 目标字符串行号
line_start=$((line-$front)) # 要删除的起始行
line_end=$((line+$back)) #要删除的结束行
echo "delete line:$line_start - $line_end"
sed -i "$line_start,$line_end d" $filename
}
#参数1:要删除的字符串 参数2:前几行 参数3:后几行 参数4:文件名
deleteArray "address 192.168.21.222" 2 2 ./interfaces