一、需求
有時有這樣的需求:在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等編程技術的技巧經驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們爲您提供幫助的最大動力。
歡迎關注。助您在編程路上越走越好!