我对脚本和正则表达式非常陌生,所以我提前道歉。从本质上讲,我正在使用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命令,可以编辑文本,您可能更喜欢它。