web-dev-qa-db-ja.com

これは、cmdウィンドウから実行した場合のcygwin GNU sed 4.4のバグですか?

これは、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からは機能しないようです。Perlを使い続けるかもしれません ターミナルの正規表現と照合するためのPerl? および 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
barlop

cygwinを使用していないため、問題は「echo」にあります。

$ 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  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のエコー出力は、以下の行でcygwinエコーのように調整されています)

C:\>echo VID_abc_def| tr -d '\r'|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
den VID_abc_def p

echo abc |またはecho abc |を実行し、echo abc|(パイプの残りのスペースがない)を実行しないようにすると、Windowsエコーの末尾にスペースが含まれる可能性があることに注意してください。 echo abc |があったとしてもそうはなりません。

(cygwinエコー、下の行)

C:\>c:\cygwin\bin\echo VID_abc_def|sed -r "s/(VID.*)(_def.*)/den \1\2 p/"
den VID_abc_def p

したがって、\ rはウィンドウエコーから来ています。 cygwinsedをつまずかせています。

3
matzeri

答え?多分そうでないかもしれません:

確実に追加する分析の1つのステップ:

追加
... | tr -d "\r" "_" あるいは
... | od -t x1zあなたのコマンドに;

odは、印刷される実際の文字を示します。

tr示されているように、CR文字を置き換えます(おそらくcmdのエコーによって追加されます)、

...これが原因かもしれません。


END ADVICE#1:混合しないでください cygwinとcmd-software。
また;これらは、Windows用にコンパイルされたフリーソフトウェアでのWindowsのCR + LF行末の問題だと思います。

0
Hannu