1. 基本思路
使用wc獲取文件的行數,並數出開始刪除的行號,然后使用sed進行刪除。
sed刪除基本命令:
sed -i "${n1},${n2}d" filename
其中-i參數是表示直接修改讀取的文件內容,而不是輸出到終端。
${n1},${n2}部分對應sed的地址匹配,都是整數,是具體的行號,表示匹配n1到n2行。
d表示刪除命令。
具體sed的教程可以參考:sed原理及使用
2. 實現與驗證
新建腳本test.sh並增加執行權限:
#!/bin/bash set -x line=$1 # 新建測試文件 cat > cc <<EOF 1 2 3 4 5 6 7 EOF echo "before deleting" cat cc # 計算需要刪除的起始行:文件總行數-需要刪除的行數+1 count=$(wc -l cc | awk '{print $1}') # 驗證行數是否正確 if [ $line -gt $count ] then echo "too much lines" exit fi from=$(($count-$line+1)) echo "all lines:$count, you want delete:$line, from:$from" sed -i "${from},\$d" cc echo "after deleting:" cat cc
驗證:
./test.sh 3 輸出: + line=3 + cat + echo 'before deleting' before deleting + cat cc 1 2 3 4 5 6 7 ++ wc -l cc ++ awk '{print $1}' + count=7 + '[' 3 -gt 7 ']' + from=5 + echo 'all lines:7, you want delete:3, from:5' all lines:7, you want delete:3, from:5 + sed -i '5,$d' cc + echo 'after deleting:' after deleting: + cat cc 1 2 3 4
開啟了調試,可以看出具體的輸出情況,最后正常刪除了最后三行,如果刪除的行數超過文件的行數則不刪除:
./test.sh 30
輸出:
+ line=30 + cat + echo 'before deleting' before deleting + cat cc 1 2 3 4 5 6 7 ++ wc -l cc ++ awk '{print $1}' + count=7 + '[' 30 -gt 7 ']' + echo 'too much lines' too much lines + exit
