Почему sed требует 3 обратных косых черт для регулярной обратной косой черты?

Мне любопытно, почему 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
42
задан markling 4 November 2019 в 11:11
поделиться

4 ответа

Мне удалось воспроизвести это поведение с помощью Vista и Cygwin 1.7.0.

  • Две обратные косые черты вызывают ошибку
  • либо три , либо четыре обратных косой черты работают
  • Пять - та же ошибка

Две обратные косые черты становятся одной обратной косой чертой в оболочке, которая затем в sed избегает косой черты, которая является средним разделителем.

\\/ -> \/ (which makes the forward slash a regular character instead of a delimiter)

Три из них: первые два становятся одним в оболочке, а затем ускользают от третьего в sed

\\\/ -> \\/

Четыре: каждая пара становится одиночными в оболочке, затем первая, в результате чего, ускользает от второй в sed

\\\\/ -> \\/ 

Править :

О, я забыл сказать, что и одинарные, и двойные кавычки работали у меня одинаково ( cmd.exe не делает различий, которые делают Bash и др.).

41
ответ дан 26 November 2019 в 23:52
поделиться

Пожалуйста, покажите пример того, что у вас есть в будущем. в 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"
4
ответ дан 26 November 2019 в 23:52
поделиться

Я полагаю, вы предполагаете \\\ n или \\\ t как три обратных косых черты, но на самом деле его 2 обратных косых черты и другие шаблоны

   backslash          \\
   newline            \n
   tab                \t

также, / может потребоваться экранирование, потому что в s /.../ , / используется для открытых и закрытых частей.

поэтому / \\\ / \ // будет \\ + \ / + \ / в соответствии с вашим обновленным примером

0
ответ дан 26 November 2019 в 23:52
поделиться

Ваша оболочка (вероятно, bash) делает свою собственную экранировку, и это сбивает вас с толку. Вы можете использовать команду echo, чтобы увидеть, что передается, или легко написать собственную программу (обычно называемую "showargs" или подобную):

$ echo "s/\\\/\//"
s/\\/\//
$ echo "s/\\/\//"
s/\/\//

Вы также можете использовать одинарные кавычки, которые в bash обрабатываются по-другому.

12
ответ дан 26 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: