Мне любопытно, почему sed нужно 3 \
только распознать тот? Я понял бы это нуждающийся 2, но 3 я не делаю.
Править: вот пример на моем компьютере Windows, с помощью Cygwin:
$ echo "sample_input\whatever" | sed "s/\\\/\//"
sample_input/whatever
Если я не добавляю 3 обратных косых черты, я получаю a
sed: -e expression #1, char 7: unterminated s' command
Мне удалось воспроизвести это поведение с помощью Vista и Cygwin 1.7.0.
Две обратные косые черты становятся одной обратной косой чертой в оболочке, которая затем в sed избегает косой черты, которая является средним разделителем.
\\/ -> \/ (which makes the forward slash a regular character instead of a delimiter)
Три из них: первые два становятся одним в оболочке, а затем ускользают от третьего в sed
\\\/ -> \\/
Четыре: каждая пара становится одиночными в оболочке, затем первая, в результате чего, ускользает от второй в sed
\\\\/ -> \\/
Править :
О, я забыл сказать, что и одинарные, и двойные кавычки работали у меня одинаково ( cmd.exe
не делает различий, которые делают Bash и др.).
Пожалуйста, покажите пример того, что у вас есть в будущем. в sed скажем, вы хотите заменить « \
» на вертикальную черту (|), например
$ cat file
asklfja \ asf
$ sed 's/\\/|/g' file
asklfja | asf
$ sed 's%\\%|%g' file #using different delimiter
asklfja | asf
, вам просто нужно один раз экранировать его.
Изменить: в примере @ OP, поскольку вы используете cmd.exe, а не bash / ksh, cmd.exe не любит одинарные кавычки. Я не могу представить ваш сценарий. Это работает для моего GNU sed в Windows с использованием двух косых черт
например
C:\test>echo "sample_input\whatever" | sed "s/\\/\//"
"sample_input/whatever"
Я полагаю, вы предполагаете \\\ n
или \\\ t
как три обратных косых черты, но на самом деле его 2 обратных косых черты и другие шаблоны
backslash \\
newline \n
tab \t
также, /
может потребоваться экранирование, потому что в s /.../
, /
используется для открытых и закрытых частей.
поэтому / \\\ / \ //
будет \\ + \ / + \ /
в соответствии с вашим обновленным примером
Ваша оболочка (вероятно, bash) делает свою собственную экранировку, и это сбивает вас с толку. Вы можете использовать команду echo, чтобы увидеть, что передается, или легко написать собственную программу (обычно называемую "showargs" или подобную):
$ echo "s/\\\/\//" s/\\/\// $ echo "s/\\/\//" s/\/\//
Вы также можете использовать одинарные кавычки, которые в bash обрабатываются по-другому.