使用 sed 命令来

Using sed command to

我正在尝试能够读取文件、替换变量或将其添加到底部(如果尚未指定)。

我得到了一点帮助才能走到这一步:

#!/bin/bash

function replaceappend() {
  if ! sed "//{s///;h};"'${x;/./{x;q0};x;q1}' 
  then
      echo "" >> 
  fi
}

replaceappend "/etc/ssh/sshd_config" "Port 22" "Port 123"

然而,在 运行 这个脚本之后,原始文件的内容似乎没有受到影响,并且保留在端口 22 上,没有任何附加内容。

在此示例中,它使用 q 标志在 sed 上使用指定的退出代码以查看它是否找到它,如果没有则附加它。

谁能看出为什么这段代码可能不起作用?

认为这就是你想要做的:

$ cat tst.sh
function replaceappend() {
    awk -v old="" -v new="" '
        sub(old,new) { replaced=1 }
        { print }
        END { if (!replaced) print new }
    ' "" > /usr/tmp/tmp$$ &&
    mv /usr/tmp/tmp$$ ""
}

replaceappend file "Port 22" "Port 123"
replaceappend file "Port 22" "Port 123"

$ cat file
line 1
Port 22
line 3
Port 71
line 5

$ ./tst.sh

$ cat file
line 1
Port 123
line 3
Port 71
line 5
Port 123

这可能对你有用(GNU sed & bash):

function replaceappend() {
    sed '/'""'/{s//'""'/;h};$!b;x;/./{x;b};x;a'"" 
}

该函数使用原始的 sed 语句,但它没有在文件末尾返回退出代码,而是检查保持 space(它已被用作标志以标记是否发生了替换) 并且在替换已经发生时不执行任何操作,或者在替换失败时将所需的字符串附加到文件末尾。