在 Shell 脚本中使用 sed

Using sed in Shell Scripting

我对脚本和正则表达式真的很陌生,所以我提前道歉。本质上,我正在使用 sed 编写一个 shell 脚本,它将替换我代码中的编译指示。这是一个例子:

#pragma foo=value //一些评论

OUTPUT(value) //一些注释

我正在尝试用底部的表达式替换顶部的表达式,同时仍保留注释。我不太确定如何将值存储为新表达式的“变量”,因为我见过的所有示例都用其他文本替换了一些文本,而不将任何内容视为变量。我能得到一些帮助吗:)?

首先,一些有用的链接供进一步学习-

Learn about regexs here

Test and trial and error your regexs here


现在关于问题本身,sed 可以做的不仅仅是替换文本,但是在替换时,语法是 sed -E 's/regex/replacement/flags'.

您可能已经看到,正则表达式没有“变量”的概念,而是有所谓的“捕获组”。

让我们从一个简单的正则表达式开始,找到您的确切示例:#pragma foo=value //some comment

要处理任何 'value',我们可以将 'value' 替换为 \w+,这意味着任意数量的字母或数字:#pragma foo=\w+ //some comment

现在拼图的最后一块是能够在替换中使用值本身。 因此,首先将正则表达式的一部分放在一个组中,您只需用括号括起来:#pragma foo=(\w+) //some comment

现在我们可以使用 </code> 来引用正则表达式中的第一个捕获组,因此替换字符串将如下所示:<code>OUTPUT() //some comment

现在将它们全部放在 sed 命令中,我认为您不需要任何标志,但您可能会注意到 sed 语法包含斜杠,但我们的正则表达式和替换。所以我们可以用反斜杠转义它们,但实际上 sed 并不关心我们是否使用斜杠或其他任何东西来分隔参数,所以我们可以改为使用例如 sed 's|regex|replacement|flags'.

结果是sed -E 's|#pragma foo=(\w+) //some comment|OUTPUT() //some comment|'

-E 标志告诉 sed 我们正在使用正则表达式功能而不是常规文本,没有它我们的正则表达式实际上将无法工作。


可能有更好的方法来完全按照您的意愿编写正则表达式,但我认为这应该可以帮助您入门。

最后,你可能想看看 awk,另一个非常强大的 shell 可以编辑文本的命令,你可能会更喜欢它。