在 cygwin 正则表达式中匹配行的开头

在 cygwin 正则表达式中匹配行的开头

sed 's/^ bug*/__/'申请

  ref      bug
  bug      ref

并得到

  ref     __
 __      ref

perl 也有同样的响应perl -ni -e 's/^ bug/__/; print'。示例文件可以下载从这里。Sed 和 perl 是我从 Windows 命令行运行的 cygwin 实用程序。当我通过 cygwin bash 运行它们时,不会发生这种情况。

答案1

问题与 cmd.exe 的“怪癖”(找不到更好的词来形容)有关,在这种情况下,它在处理单引号内的非字母数字字符时会忽略插入符号和空格字符。

避免该问题的最简单方法(如果在适当的 Cygwin bash shell 中运行它不是一个理想的选择)是使用双引号......

C:\cygwin\home\costa\wk>sed 's/^  bug*/__/' sed.txt
  ref    __
__      ref

C:\cygwin\home\costa\wk>sed "s/^  bug*/__/" sed.txt
  ref      bug
__      ref

答案2

首先,改用这个:

sed 's/^ *bug-+/__/' input

这样,它就可以适用于前面的多个空格bug和后面的一个或多个破折号。不过,这只是一个小细节。您发布的命令在我的 Debian 上运行良好。

你能发布实际的您要修改的文件是什么?我猜您使用的是 Windows 或 Mac 风格的行尾,这可能会使 sed 感到困惑。如果我没记错的话,这应该会有所帮助:

perl -pi -e 's/\r\n|\n|\r/\n/g' input

sed然后再次对该文件运行相同的命令。

如果这不起作用,可能是 cygwin 的 存在一些特殊问题sed。请尝试使用这个 Perl 命令(确保行尾字符\n在上述命令之后):

perl -ne 's/^\s*bug-+/__/; print'

答案3

(这本应是一条评论,但我的声誉还不足以添加评论......)

你简直把我的脑子搞糊涂了。在我的 Cygwin 中,也发生了同样的事情。我震惊了。这似乎是通配符处理方式的一个错误,无论它们是使用正则表达式语法还是 glob 样式(glob--style 中 * 表示“任意数量的任何类型的字符”,正则表达式 * 表示“0 个或更多前面的字符”)。

所以我在 QNX shell 中尝试了它。如果我不尝试在 bug 前使用加号,例如“s/^ +bug-/__/”,它就可以工作。我可以用 * 代替 +,它就可以工作。我认为 sed 的一些实现在选择正则表达式或 glob 语法时遇到了困难,结果是一个不可预测的混乱。

我没有尝试过 Perl(还没有在这台新机器上安装它),但如果 Perl 处理得如此糟糕,我会感到更加震惊。

为了回答你的问题,据我所知,以及我在 Google 上最亲密的 10 万个朋友,你对 ^ 运算符的理解应该工作准确。

相关内容