我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 万个朋友,你对 ^ 运算符的理解应该工作准确。