【问题标题】:Awk match only when line starts with result仅当行以结果开头时,Awk 才匹配
【发布时间】:2015-03-15 20:13:52
【问题描述】:

我有以下代码:

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

replaceappend "/etc/ssh/sshd_config" "Port" "Port 222"

它运行良好,但我希望对其进行修改,以便 awk 命令仅在该行以该结果开头时才找到匹配项。所以如果它正在寻找“端口”这个词:

Port 123 # Test   <- It would match this one
This is a Port    <- It would not match this one

我曾尝试查看其他询问“Awk line started with”的帖子,例如这个,但我无法理解它:

awk, print lines which start with four digits

【问题讨论】:

  • 看起来你在下面得到了你的答案,但我建议你研究一下 sed,因为我相信你可以用 sed 在一行中做到这一点。它看起来像这样:sed -i 's/^Port.*/Port 222/' /etc/ssh/sshd_config。但是,IIRC -i 选项在 BSD 系统上不存在。
  • @LukeMat 你说得对,sed 很有用。然而,在这种情况下,Jimmy 想在替换命令中使用变量,这使sed 中的事情变得复杂。 (可以在s/../../ 命令中替换shell 变量,但必须注意shell 活动字符......)此外,BSD sed 确实支持-i。问题是 BSD 语法与 GNU -i 版本不兼容。
  • 好吧,我建议不存在函数,而是调用sed,因此希望他不必担心将shell 变量放在那里。不管怎样,只是一个可能的建议。
  • 感谢两位的建议。我实际上使用 sed 开始,但是当 sed 命令变得非常复杂时,我被建议使用 awk。我认为任何一个都可以很好地完成这项工作。

标签: linux bash shell awk debian


【解决方案1】:

在正则表达式中,^ 仅匹配行首。因此,要仅在行首匹配Port,请编写^Port

例如,让我们创建一个文件;

$ cat >testfile
Port 123 # Test   <- It would match this one
This is a Port    <- It would not match this one

应用你的功能:

$ replaceappend testfile ^Port REPLACED

结果:

$ cat testfile 
REPLACED 123 # Test   <- It would match this one
This is a Port    <- It would not match this one

GNU documentation 有更多关于 GNU awk 支持的正则表达式的信息。

【讨论】:

  • 感谢您的回答。我总是想把它和开头匹配,所以我可以修改函数吗?例如,将第二行更改为:awk -v old="^$2" -v new="$3" '
猜你喜欢
  • 2016-09-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多