【问题标题】:Replacing/Inserting a line to the end of a file在文件末尾替换/插入一行
【发布时间】:2017-03-23 08:26:43
【问题描述】:

我正在尝试创建一个在文件末尾插入一行的脚本。但是如果我多次调用脚本它不应该在文件中多次创建相同的条目。

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

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

第 21 行是空的,因此该命令不起作用。无论如何通过修改此命令将一行插入一个空字符串?

我知道附加到文件末尾的其他方法,但我主要关心的是如果脚本被多次调用,则不要创建同一行的副本。

【问题讨论】:

    标签: linux bash text sed text-processing


    【解决方案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/:用它的内容替换它,后跟一个换行符,然后是IP=192.168.1.1

    【讨论】:

    • 谢谢。这正是我想要的。
    【解决方案2】:

    试试这句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”。

    【讨论】:

      【解决方案3】:

      你可以使用 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
      

      如果你想保存输出,只需将输出重定向到一个文件。

      【讨论】:

      • 这个解决方案会覆盖最后一行,我认为OP不想覆盖,只是在文件的最后一个非空行之后追加。
      • 祖莫你错了。如果该行已经存在,它不会附加同一行。请检查 if 语句。
      • 由于某种原因,如果我尝试使用示例文件的命令,如果最后一行与 IP 行不匹配,那么它将用 IP 行覆盖我文件的最后一行,如果最后一行与IP 线,然后重复同一条线。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多