2017-03-23 37 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行匹配,那么同一行被复制。 –