在Shell脚本中使用sed



我对脚本和正则表达式非常陌生,所以我提前道歉。从本质上讲,我正在使用sed编写一个shell脚本,它将替换代码中的杂注。这里有一个例子:

#pragma foo=值//一些注释

OUTPUT(值(//一些注释

我试图用底部的表达式替换顶部的表达式,同时仍然保留注释。我不太确定如何将价值存储为";变量";对于新表达式,正如我所看到的所有示例一样,用其他文本替换一些文本,而不将任何内容视为变量。我能得到一些帮助吗:(?

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

在这里了解regexs

在这里测试并尝试并错误您的正则表达式


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

正如您可能已经看到的,regex没有";变量";,相反,它具有所谓的";捕获组";。

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

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

现在,难题的最后一块是能够在替换中使用值本身。所以,首先要将正则表达式的一部分放入一个组中,只需将其括在括号中:#pragma foo=(w+) //some comment

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

现在,将所有这些放在sed命令中,我认为您不需要任何标志,但您可能会注意到sed语法包括斜杠,但我们的regex和替换也是如此。所以我们可以用反斜杠对它们进行转义,但实际上sed并不在乎我们是否使用斜杠或其他任何东西来分隔参数,所以我们可以使用例如sed 's|regex|replacement|flags'

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

-E标志告诉sed我们使用的是regex功能,而不是常规文本,如果没有它,我们的regex将无法实际工作。


可能有更好的方法可以随心所欲地编写正则表达式,但我认为这应该让你开始。

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

相关内容

  • 没有找到相关文章

最新更新