Bash 要替换或附加的脚本

Bash script to replace or append

我是 Bash 脚本编写的新手,我遇到了一些困难。我正在尝试更改配置文件的配置值。如果它找到一个现有值,我希望它更新它,但如果它不存在,我希望它附加它。这是我从各种在线教程和片段中获得的信息:

# FUNCTION TO MODIFY CONFIG BY APPEND OR REPLACE
#  File
#  Find
#  Replace / Append
function replaceappend() {
    grep -q '^' 
    sed -i 's/^.*//' 
    echo '' >> 
}

replaceappend "/etc/test.conf" "Port 20" "Port 10"

然而,正如您想象的那样,这是行不通的。这似乎与它背后的逻辑有关,我不确定如何捕获 grep 的结果以便选择 sed 或 echo。

只需使用命令的 return 值并使用双引号而不是单引号:

if ! sed -i "//{s///;h};"'${x;/./{x;q0};x;q1}' 
then
    echo "" >> 
fi

来源:Return code of sed for no match 用于 q 命令

这超出了我正常使用 sed 的范围,所以让我解释一下它是如何工作的,据我所知:

sed "//{s///;h};"'${x;/./{x;q0};x;q1}' 

第一个 // 是一个地址 - 我们将在 {...} 中对任何匹配它的行执行命令。作为副产品,它还将模式 -space 设置为 </code>.</p> <p>命令 <code>{s///;h} 表示用 </code> 替换 pattern-space 中的任何内容,然后将 pattern-space 保存在 "hold-space" , sed 中的一种缓冲区。</p> <p>单引号后的 <code>$ 是另一个地址 - 它表示在最后一行执行下一个命令。

命令 {x;/./{x;q0};x;q1} 表示:

  • x = 交换 hold-space 和 pattern-space
  • /./ = 匹配任何内容的地址
  • {x;q0} = 交换 hold-space 和 pattern-space - 如果成功(hold-space 中有东西)然后 q0 =以 0 状态退出(成功)
  • x;q1 = 交换 hold-space 和 pattern-space - 因为现在成功了(由于之前的 x)然后 q1=exit with 1 status (失败)

第一部分周围的双引号允许替换 </code> 和 <code>。后面部分的单引号防止错误替换 $.

有点复杂,但只要文件中有内容,它似乎就可以工作。一个空文件仍然会成功,因为你在最后一行没有得到任何匹配项。

老实说,在所有这些复杂的事情之后......除非你正在处理的文件真的很长,以至于双重传递真的很糟糕我可能会回到 grep 解决方案,比如这个:

if grep -q "^" 
then
    sed -i "s/^.*$//" 
else
    echo "" >>
fi

以后更容易理解和维护...