2015-11-06 55 views
0
k=$1 
m=$2 
fileName=$3 
head -n -$k "$fileName" | tail -n +$m 

我有bash代碼。 當我執行它時,它只刪除它應該刪除的內容。例如./strip.sh 4 5 hi.txt > bye.txt應該刪除前4行和後5行,但它只刪除前4行並保留「4」行。此外,當我執行./strip.sh 1 1 hi.txt > bye.txt,它只是刪除最後一行,而不是第一行....從流的頭部和尾部刪除指定數量的行

+1

'head -n -N'是「除最後N行外的所有行」。 'tail -n + N'是「從第N行開始」。 –

+0

這與git有什麼關係? – 123

+0

@ 123,大概是OP在Windows上運行它,並使用由git包提供的msys構建的bash。這偶爾是非常偶然的(特定的構建有一些錯誤;例如,流程替換 - 即<()'表達式)無法正常工作),但並不經常。 –

回答

2
#!/bin/sh 
tail -n +"$(($1 + 1))" <"$3" | head -n -"$2" 

測試如下:

set -- 4 5 /dev/stdin # assign $1, $2 and $3 
printf '%s\n' {1..20} | tail -n +"$(($1 + 1))" <"$3" | head -n -"$2" 

...這5和15之間的打印正確的數字,從前面修剪前4個,從後面修剪5個。同樣,使用set -- 3 6 /dev/stdin時,將打印4和14之間的數字,這同樣是正確的。