【问题标题】:“sed” error when using characters »<« and »>« in script在脚本中使用字符 »<« 和 »>« 时出现“sed”错误
【发布时间】:2019-08-06 07:51:49
【问题描述】:

我正在尝试从一些源代码中删除一些 cpp #include 语句。我决定使用名为“sed”的非常棒的实用程序来做到这一点。当我尝试通过以下方式执行“sed.exe”时:

sed -re '/#include \<syslog\.h\>/ d' < syslog.h > changed_syslog.h
sed -re '/#include <syslog\.h>/ d' < syslog.h > changed_syslog.h

我得到错误:

sed: -e expression #1, char 13: unterminated address rege

如果我尝试以下行:

sed -re '/#include .syslog\.h./ d' < syslog.h > changed_syslog.h

然后一切都按预期进行。

现在我想知道我在前两个命令中做错了什么?

我正在使用 Cygwin 1.7.17 中的 sed.exe。

syslog.h 文件如下(只有一行):

#include <syslog.h>

【问题讨论】:

  • 不应该是sed -r '/#include \&lt;syslog\.h\&gt;/d' syslog.h &gt; changed_syslog.h吗?
  • @Wiktor Stribiżew -r 代表在脚本中使用扩展的正则表达式,-e 代表将脚本添加到要执行的命令中。我也试过你的命令行,但我得到了同样的错误。
  • 我知道re 做了什么。 file 参数肯定不需要&lt;e 在这里是多余的
  • 请注意,\&lt;\&gt; 表示 sed 中单词的开始/结束,不需要在正则表达式或替换命令的 RHS 中引用 &lt; 或你用单引号括住 sed 命令。

标签: regex sed cygwin


【解决方案1】:

sed 抱怨“地址正则表达式”未终止。地址正则表达式是/#include \&lt;syslog\.h\&gt;/,因此这意味着sed 没有看到最终的/

在这种情况下,问题在于 Windows shell 将&lt;syslog\.h&gt; 中的&lt;&gt; 字符视为重定向。解决方案是使用^ 引用它们:

sed -re '/#include ^<syslog\.h^>/ d'

【讨论】:

  • 是的,当我使用文件中的脚本运行 sed 命令时,您是对的。所以,我的解决方案是将脚本 '/#include /d' 放入文件 script.sed,然后按以下方式运行 sed:sed -r -f script.sed。而且我忘了提到我是从批处理文件中运行这个命令的。您对字符“”也是正确的,它们是 Windows 命令行中明显的特殊字符。另一个更好的解决方案是通过以下方式转义这些字符“”:sed -r '/#include ^/d' 然后它也可以工作。
  • 没问题,乔。感谢您的建议编辑 - 我已将其合并并剪掉了一堆绒毛
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多