Warum ist es wahr, dass drei Backslashes für Windows zum Ersetzen benötigt werden

2204
panny

Bezüglich dieser Frage:

Warum wird ein Zusatz \benötigt cmd.exe, um mit sed(MinGW msys-1.0) zu arbeiten, wenn \kein Sonderzeichen gemäß cmd /?(siehe letzter Absatz oder hier ) ist?

Die folgenden Sonderzeichen erfordern Anführungszeichen: & <> [] {} ^ =; ! '+, `~ [Leerzeichen]

Der erste Backslash entgeht dem zweiten und raubt ihm seine besondere Bedeutung. Es werden zwei verbleibende Backslashes gegeben, seddenen der dritte durch Verwendung des zweiten entgeht, so dass am Ende ein einziger Backslash übrig bleibt, der mit meinem Suchen und Ersetzen übereinstimmt. Trotzdem bin ich mit dieser Erklärung nicht zufrieden, denn:

cmd ausführen nicht Tokenisieren so der erste Schritt des Entkommen aus keinen Sinn macht ... hier, \hat nur eine besondere Bedeutung, wenn vorhergehenden "... so was ist die wirkliche Erklärung?

auf bash in linux:

echo 'sample\input' | sed 's/\\/----/' sample----input 

auf cmd.exein Windows XP SP3 (nicht 'erforderlich):

echo sample\input | sed "s/\\/----/" sed: -e expression #1, char 9: unterminated 's' command  // for some reason sed received only one backslash which causes him trouble ?  echo sample\input | sed "s/\\\/----/" sample----input 
2

1 Antwort auf die Frage

3
barlop

Sed is doing it, it uses a regex in the "find" section. it uses BRE or ERE or PCRE depending on the switch. Backslash is special within a regex.

Added

I haven't used your version of using single quotes 'cos that makes no sense to me in cmd.exe!! cmd.exe uses double quotes if at all.

And it works fine.

tested with gnuwin32's sed run from cmd.exe as it is meant to be.

C:\>echo sample\input | sed "s/\\/----/" sample----input C:\>sed --v GNU sed version 4.2.1 Copyright (C) 2009 Free Software Foundation, Inc. 

If I was testing cygwin's sed i'd run it from the cygwin window as that's where cygwin programs are meant to be run. And then i'd use single quotes. msys seems similar to cygwin in that sense.

UPDATE

You can run cygwin's sed from cmd, or from cygwin. They behave different because they are different GNU versions, but I don't see any shell related issue running from cmd vs running from cygwin (other than the simple point about single quotes for cygwin 'cos eg bash, and double quotes for cmd).

And cygwin's is a much later version of sed. Gnuwin32's sed, like many gnuwin32 things including gnuwin32 grep, is years out of date. and e.g. later greps can fix bugs in earlier greps. The 2009 sed that gnuwin32 uses, or less up to date version that gnuwin32 uses, may be ok but may be better to use a recent version that cygwin would use.

Interestingly, the seds behave differently regarding backslash.. I can see how to get it working in the later sed, the sed that cygwin uses.

C:\blah>echo a\bc | c:\cygwin\bin\sed "s/\\/_/" /usr/bin/sed: -e expression #1, char 6: unterminated `s' command C:\blah>echo a\bc | c:\cygwin\bin\sed "s/\\\/_/" a_bc C:\blah>echo a\bc | "c:\Program Files (x86)\GnuWin32\bin\sed" "s/\\/_/" a_bc 

The earlier sed (gnuwin32's sed), allows "s/\/_/" It's not escaping the forward slash. So the backslash is escaping the backslash to make a literal backslash. And the forward slash after the two backslashes, remains fine. And it works in that.

note- running cygwin's sed in cmd is fine. And since it's a later version it's preferable to gnuwin32's sed.

The later sed (cygwin's sed), does not allow "s/\/_/" because the / is escaping the forward slash. Instinct(and correct instinct) would be try adding another backslash and see what happens. And it works. Not sure the mechanics but I guess a single backslash in the later sed is \\\.

C:\blah>echo \ | c:\cygwin\bin\sed "s/\\\/d/" d 
Ich stelle fest, dass meine Antwort nur teilweise erklärt, da sie die drei immer noch nicht erklärt. Warum nicht zwei? barlop vor 11 Jahren 0
die "windows" sed oder "unix" sed oder beide? panny vor 11 Jahren 0
@panny weiß nicht, was er verwendet oder warum er einfache Anführungszeichen in cmd verwendet. Aber ich habe eine Version von ihm mit doppelten Anführungszeichen ausprobiert, und es hat gut funktioniert, nur zwei Backslahes. AH er benutzt anscheinend msys. barlop vor 11 Jahren 0
Wenn Sie msys verwenden, würde ich vorschlagen, mingw32 gui zu verwenden, was ich in Screenshots davon gesehen habe. Wenn Sie cmd.exe verwenden möchten, verwenden Sie einen Win32-Port. Gnuwin32 hat einen Windows-Port von sed. barlop vor 11 Jahren 0
@panny Ich neige dazu, Dinge nicht zu mischen. Also, Cygwin-Dinge, die ich innerhalb von Cygwins Fenster in Fenstern verwende. Wenn ich msys verwendete, würde ich es in einem Mingw32-Fenster verwenden. Und gnuwin32-Sachen, die ich in cmd.exe verwenden würde. Aber wenn Sie Dinge mischen möchten, würde ich versuchen, doppelte Anführungszeichen in cmd zu verwenden, da Sie in cmd gedacht sind. Aber das Mischen von Dingen erscheint unnötig und kann die Dinge komplizieren barlop vor 11 Jahren 1
danke für den Hinweis mit dem `` ` panny vor 11 Jahren 0
Sie haben absolut Recht mit den nicht mischenden Fenstern, danke auch für diesen Hinweis! In welchem ​​Fenster haben Sie die Zeilen in Ihrer Antwort ausgeführt? panny vor 11 Jahren 0
lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/7796/discussion-between-barlop-and-panny) barlop vor 11 Jahren 0
@panny (nur sicherstellen, dass Sie die Benachrichtigung mit meiner Antwort erhalten haben) barlop vor 8 Jahren 0