一、需求
有时有这样的需求:在Linux中,一个文件中要删除含有某字符串的一行及前后几行,这时可以使用bash脚本进行解决。
二、代码
#! /bin/bash
# 功能:删除匹配某字符串的行,以及匹配行的前后几行
# 参数1:要删除的行中的字符串 参数2:也需要删除的前几行行数 参数3:也需要删除的后几行行数 参数4:文件名
deleteKeywordAndPreviousNextLines(){
# 要删除的行中的字符串
keyword=$1
# 也需要删除的前几行行数
beforeLines=$2
# 也需要删除的后几行行数
afterLines=$3
# 文件名
filename=$4
# 获取目标字符串行号
# grep命令提取匹配目标字符串所在行的行号与行的所有字符
# head命令取结果中的第一行
# awk命令提取第一列,即:行号
lineItem=$(grep -nE "$keyword" $filename | head -1 | awk -F ":" '{print$1}')
while [ -n $lineItem ]
do
echo "lineItem:${lineItem}"
# lineItem为空时跳出循环,到达结尾,不再处理
if [ -z "$lineItem" ]
then
break
fi
# lineItem小于等于0时说明到达结尾,不再处理
if [ "$lineItem" -le 0 ]
then
break
fi
# 要删除的起始行
line_start=$(($lineItem-$beforeLines))
# 要删除的结束行
line_end=$(($lineItem+$afterLines))
# 输出要删除的起止行号
echo "delete line:$line_start - $line_end"
# sed命令删除文件filename中从line_start行到line_end行的数据
# -i代表直接操作文件
sed -i "$line_start,$line_end d" $filename
# 获取目标字符串行号
# grep命令提取匹配目标字符串所在行的行号与行的所有字符
# head命令取结果中的第一行
# awk命令提取第一列,即:行号
lineItem=$(grep -nE "$keyword" $filename | head -1 | awk -F ":" '{print$1}')
done
}
# 调用函数
# 参数1:要删除的行中的字符串 参数2:也需要删除的前几行行数 参数3:也需要删除的后几行行数 参数4:文件名
deleteKeywordAndPreviousNextLines "hello" 0 3 ./test.txt
# 引申
# 若需删除匹配某字符串hello的行和匹配行的后2行,可以使用下面的脚本
sed -i '/hello/,+2d' ./test.txt
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!