2015-10-09 90 views
2

我必須從shell腳本中刪除文件中的一行。無法刪除shell腳本中的文件行

我想這一點:

linenumber=0 
##CHeck If server IP exists 
if grep -wq $serverip $FILE; then 
     echo "IP exists" 
     linenumber=$(awk -v serverip="$serverip" '$0 ~ serverip {print NR}' $FILE) 
     echo "$linenumber" 
     sed -e '${$linenumber}d' $FILE 

fi 

基本上我提取的行號,然後想刪除它。

sed -e '1d' $FILE --> WOrks on CLI but inside script does not work 

爲什麼?如何讓它工作?

+0

也許你想使用'sed -i'來修改文件而不是將結果輸出到stdout? –

回答

3

這只是在你的sed命令周圍使用不正確的引號的情況,所以這個變量沒有被使用。忽略了你不必要使用3種工具時1就足夠了事實,修復是這樣的:

sed -e "${linenumber}d" "$FILE" 

也許你的要求是比較複雜的比它出現,但我建議改變你的整個腳本這樣的:

awk -v serverip="$serverip" '!($0 ~ serverip)' "$FILE" 

這會打印每行不包含shell變量$serverip的行。假設您已經轉義了變量中存在的任何正則表達式元字符。

或者(和更簡潔):

sed "/$serverip/d" "$FILE" 

如果你真的想打印出來的消息(我認爲他們是爲了調試),那麼這是很容易實現:

awk -v serverip="$serverip" '$0 ~ serverip { print "IP exists"; print NR; next } 1' "$FILE" 

如果您最後不熟悉1,它只是一種常見的簡寫形式,它會導致awk打印每行(1始終爲true,默認操作爲{ print })。

+1

或者,sed代替awk:'sed「/ $ serverip/d」「$ FILE」' - 與正則表達式相同的警告。 –

+0

我總是默認使用awk,但是,這可能更好,謝謝。 –

+1

我同意:只要我把';'輸入到sed腳本中,我就會考慮使用不同的工具。 –