在 Shell 脚本中使用 sed
Using sed in Shell Scripting
我对脚本和正则表达式真的很陌生,所以我提前道歉。本质上,我正在使用 sed 编写一个 shell 脚本,它将替换我代码中的编译指示。这是一个例子:
#pragma foo=value //一些评论
至
OUTPUT(value) //一些注释
我正在尝试用底部的表达式替换顶部的表达式,同时仍保留注释。我不太确定如何将值存储为新表达式的“变量”,因为我见过的所有示例都用其他文本替换了一些文本,而不将任何内容视为变量。我能得到一些帮助吗:)?
首先,一些有用的链接供进一步学习-
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 可以编辑文本的命令,你可能会更喜欢它。
我对脚本和正则表达式真的很陌生,所以我提前道歉。本质上,我正在使用 sed 编写一个 shell 脚本,它将替换我代码中的编译指示。这是一个例子:
#pragma foo=value //一些评论
至
OUTPUT(value) //一些注释
我正在尝试用底部的表达式替换顶部的表达式,同时仍保留注释。我不太确定如何将值存储为新表达式的“变量”,因为我见过的所有示例都用其他文本替换了一些文本,而不将任何内容视为变量。我能得到一些帮助吗:)?
首先,一些有用的链接供进一步学习-
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 可以编辑文本的命令,你可能会更喜欢它。