这是从 cmd 窗口运行时 cygwin GNU sed 4.4 中的错误吗?
这有效
C:\>echo asdf| sed "s/a/w/"
wsdf
C:\>
这是可行的(除了输出不太正确,因为在“den”之前不应该有空格)
C:\>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1 p/"
den VID_abc p
C:\>
这些根本不起作用。输出开始时应该没有空格并且应该说 den...
C:\>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
pn VID_abc_def
C:\>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
pen VID_abc_def
C:\>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
pden VID_abc_def
C:\>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
p den VID_abc_def
C:\>
这有效
C:\>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1 p/"
den VID_abc p
C:\>
一旦我添加 \2 它就不起作用并且不再以 'den' 开头
C:\>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
pn VID_abc_def
C:\>
但在 cygwin 窗口中它工作正常
$ echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
den VID_abc_def p
我不确定是否有适用于 Windows 的 sed。Gnuwin32 的东西都很旧了。Cygwin sed 更新一些,但似乎无法从 cmd 运行。我可能会坚持使用 perlPerl 用于在终端中与正则表达式进行匹配吗?和https://stackoverflow.com/questions/4794145/perl-one-liner-like-grep
C:\>echo VID_abc_def|perl -0777 -pe "s/(VID.*)(_def.*)/den \1\2 p/"
den VID_abc_def p
C:\>
目前,似乎没有适用于 Windows 的可靠的最新 sed,并且多年来一直如此。
$ sed --version
sed (GNU sed) 4.4
Packaged by Cygwin (4.4-1)
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: </...>.
和
C:\>sed --version
sed (GNU sed) 4.4
Packaged by Cygwin (4.4-1)
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <...>.
C:\>
答案1
问题出在“echo”上,因为您没有使用 cygwin。
$ cmd
Microsoft Windows [Version 10.0.18363.720]
(c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.
D:\cygwin64\home\Marco>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1 p/"
den VID_abc p
D:\cygwin64\home\Marco>echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1 p/"
den VID_abc p
使用 cygwin echo
$ echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1 p/"
den VID_abc p
$ echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1 p/"
den VID_abc p
由 barlop 添加
你说得对..
C:\>echo abc|xxd -p
6162630d0a
(xxd 可从 vim7 或 cygwin 获得.. 0d=\r)
(调整 Windows echo 输出,使其像 cygwin echo,如下行)
C:\>echo VID_abc_def| tr -d '\r'|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
den VID_abc_def p
echo abc |
(请注意,如果您执行或,则Windows echo 可能会有尾随空格,echo abc |
并且为了避免这种情况,您会这样做echo abc|
(管道中没有剩余空间),而即使您有,cygwins 也不会这样做echo abc |
。
(cygwin echo,在下面的行中)
C:\>c:\cygwin\bin\echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
den VID_abc_def p
因此 \r 来自 Windows echo。并且绊倒了 cygwin sed。
答案2
答案是什么?也许有,也许没有:
需要确定添加的分析步骤:
添加
... | tr -d "\r" "_"
甚至
... | od -t x1z
到您的命令;
外径显示实际打印的字符。
tr如下图所示,替换所有 CR 字符(可能是由命令的回声)
...这可能是罪魁祸首。
结束建议#1:不要混合cygwin 和 cmd -software。
另外,我相信这些是 Windows 的 CR+LF 行尾问题,在为 Windows 编译的免费软件中。