【问题标题】:Using sed command to使用 sed 命令
【发布时间】:2015-03-15 15:05:39
【问题描述】:

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

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

#!/bin/bash

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

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

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

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

谁能明白为什么这段代码可能不起作用?

【问题讨论】:

  • 你的q的标题少了一个字。
  • 您的意思是使用sed -i
  • Can anyone see why this code may not work? - 是的,它非常复杂并且充满了神秘的语言结构。 sed 用于单行上的简单替换,其他任何内容只需使用 awk。在 1970 年代中期,当 awk 被发明时,您使用的大多数 sed 构造都已过时。如果您编辑您的问题以显示一些示例输入和预期输出,我们可以帮助您创建一个更简单、更清晰且可能更简洁的解决方案。

标签: bash shell awk sed debian


【解决方案1】:

认为这就是你想要做的:

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

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

【讨论】:

  • 您好,感谢您的帮助。使用您的代码和此命令replaceappend "/etc/ssh/sshd_config" "Port 22" "Port 123" 似乎使我的文件保持不变,并且文件顶部的“端口 22”。我会继续测试它,因为我可能弄错了我的结局。这是在 debian 7 上安装的。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 2022-01-10
    • 2014-03-05
    • 2014-08-03
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2021-06-17
    • 2018-10-28
    相关资源
    最近更新 更多