2017-03-23 88 views
0

我試圖創建一個腳本,在文件末尾插入一行。但是,如果我多次調用腳本它不應該在文件中多次創建相同的條目。替換/插入一行到文件末尾

所以如果我在第21行插入文件,我知道這是文件的結尾。

sed -i '21s/.*/IP=192.168.1.1/' ip 

第21行爲空,因此此命令不起作用。無論如何,通過修改這個命令來插入一行到一個空字符串?

我知道其他方法追加到文件的末尾,但我主要關心的是不創建同一行的副本,如果腳本被多次調用。

回答

1

隨着SED:

sed -i '${/IP=192\.168\.1\.1/!s/.*/&\nIP=192.168.1.1/}' file 

工作原理:

  • $:文件的最後一行
  • /IP=192\.168\.1\.1/!匹配:如果最後一行不包含IP
  • s/.*/&\nIP=192.168.1.1/:用它的內容替換它,接着是newl ine跟着IP=192.168.1.1
+0

謝謝。這正是我想要的。 –

-1

嘗試用這種if一句話:

if [[ $(tail -1 filename.txt) != IP=192.168.1.1 ]]; then echo "IP=192.168.1.1" >> filename.txt; fi 

可能追加「IP = 192.168.1.1」在這個情況下,該文件的到底是不是最後一行。

-1

您可以通過使用awk完成這件事:

awk -v "total=$(wc -l file.1 | awk '{print $1}')" '{if(total==NR && $0 != "IP=192.168.1.1") { print "IP=192.168.1.1" } else { print $1 } }' file.1 

如果你想保存輸出,只是輸出重定向到文件中。

+0

這個解決方案會覆蓋最後一行,我想OP不想覆蓋,只是在最後一個非空行後面追加一個文件。 –

+0

Zumo你錯了。如果該行已經存在,它不會追加相同的行。請檢查是否有聲明。 –

+0

由於某種原因,如果我用示例文件嘗試命令,如果最後一行與IP行不匹配,那麼它會用IP行覆蓋我的文件的最後一行,如果最後一行與IP行匹配,那麼同一行被複制。 –