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