Использование регулярного выражения \\по сравнению с использованием \

Когда мой корневой жесткий диск поврежден, индикатор просто продолжал мигать, и застрявшая система,

Временным решением является попытка заполнить поврежденные тюремные корпуса, сначала найти все сбойные блоки с badblocks, затем используйте hdparm для сообщения жесткого диска прекращают использовать тот блок.

Но это стоило бы прекрасного времени, я не делаю этого стоящий того.

10
20.10.2014, 10:24
4 ответа

Во-первых, отметим, что единственная косой спички слишком много:

$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
 e.g.

относится к Bash , бесперебойный период такой же, как и срок. Bash проходит в период GREP . Для Greep, период совпадает с чем угодно.

Теперь рассмотрим:

$ echo $'eegg \n e.g.' | grep e\\.g\\.
 e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
 e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$

, когда Bash видит двойную косулью, уменьшает его на одну косулью и проходит, чтобы на Греп, который, в первом из трех тестов выше, видит, как мы хотим, одну косулью до периода. Таким образом, это делает правильную вещь.

С тройной косулью, Bash уменьшает первые два на одну косулью. Затем он видит \. . Поскольку сбежавший период не имеет особого значения для Bash, это сводится к простому периоду. Результатом заключается в том, что Greep видит, как мы хотим, слешь до периода.

с четырьмя ударами, Bash уменьшает каждую пару на одну косулью. Bash проходит на Greep два косания и период. Греп видит две кособыки и период и уменьшает две косынки в один литерал Slash. Если вход не имеет буквальной слез, а затем любой символ, нет совпадений.

Чтобы проиллюстрировать, что последний, помните, что внутри одной цитаты все символы являются буквальными. Таким образом, учитывая следующие три входных строка, команда GREP совпадает только на линии с буквальной косулью на входе:

$ echo 'eegg
e.g.
e\.g\.' |  grep e\\\\.g\\\\.
e\.g\.

Краткое изложение поведения Bash

для Bash, правила

  • Две скольжения сводится к Одиночная слеш.

  • Слешь перед нормальным характером, как период, является просто нормальным характером (периодом).

Таким образом:

$ echo \. \\. \\\. \\\\.
. \. \. \\.

Существует простой способ избежать всей этой путаницы: на командной строке Bash регулярные выражения должны быть помещены в однозначные цитаты. Внутри одиночных цитат, Bash оставляет все одни.

$ echo '\. \\. \\\. \\\\.'  # Note single-quotes
\. \\. \\\. \\\\.
9
27.01.2020, 20:01

Когда вы делаете grep grep e\. g\. , оболочка потребляет обратный слеш, таким образом, вы делаете grep, например, , который совпадает. Когда вы делаете grep e\\.g\\. , оболочка снова потребляет косую черту, и теперь вы делаете grep e\.\g. , который снова совпадает. Теперь обратный слеш на оболочке выглядит как \\. Итак, когда у вас есть \\, первая - это экранирующая последовательность, вторая - буквальная обратная косая черта. Когда вы делаете grep e\\\.g\\\. , все равно будет grep e\.\g. , потому что до первого \ нет последовательности выхода (\, чтобы сделать ее буквальной \. Имейте в виду, что \ - это обратная косая черта, поэтому grep e\\\\.\\\g заканчивается тем, что grep e\\.g\\. , что явно не совпадает.

Чтобы увидеть, как оболочка видит то, что вы делаете, используйте echo (например, echo grep e\\.g\\. <<< "это, например, вау" против echo grep e\\\\.g\\\\. <<< "это напр. вау")

3
27.01.2020, 20:01

Вывод одинаков только для вашей строки, но в целом эти регулярные выражения делают разные вещи Отказ Давайте немного изменим свой пример, добавив второй шаблон E, G, (с COMAS), третий E \ .g \. (DOTS), Четвертый E \, G \, (COMAS), и -O опция для печати только подходящих деталей.

  • в следующем случае . соответствует любому CHAR (обратите внимание » , например . . , я приду к этому позже)

     $ GreeP -O 'E.g.  <<< greep -o 'e.g.'  <<< 'Это например,  E, G, E \ .g \.  например\,'
    например
    например,
     
  • Далее мы уважаем . с обратной ячейкой \ , поэтому только буквальный . будет сопоставлено:

     $ grep -o 'e \ .g \.'  <<< 'Это например,  E, G, E \ .g \.  например\,'
    например
     
  • Но мы можем избежать \ с другим \ , так что буквальный \ будет соответствовать . (то есть любой Char):

     $ GreeP -O 'E \\. G \\'  <<< 'Это например,  E, G, E \ .g \.  например\,'
    например\.
    например\,
     
  • Но если мы хотим соответствовать только \. Не \, , затем еще один \ \ необходимо для избежать особого значения точки:

     $ GreeP -O 'E \\\. G \\\.  «  <<< 'Это например,  E, G, E \ .g \.  например\,'
    например\.
     

Теперь, потому что вы не использовали «« вокруг аргумента GreeP, вам нужно добавить еще одну обратную косание, чтобы избежать толчков от интерпретации оболочки, поэтому:

grep 'e\.g\.'     => grep e\\.g\\.
grep 'e\\.g\\.'   => grep e\\\\.g\\\\.  (each backslash has to be quoted separately)
grep 'e\\\.g\\\.' => grep e\\\\\\.g\\\\\\. (3 x 2 = 6 backslashes in total)
4
27.01.2020, 20:01

две команды производят тот же вывод только для вашего входа, но иначе они отличаются. Для понимания того, что продолжается, мы должны знать, как параметр, интерпретируемый сначала удар и затем grep.

Выход в ударе

\ является специальным символом, который отменяет особое значение следующего символа включая \ самого. Если следующий символ не имеет никакого особого значения затем, он передается без изменения. Примеры с командой и результатом:

  • \a эха: — обычный символ, которого оставляют, дает символ
  • эхо \\: \ — специальный символ, которого оставляют, дает символ
  • эхо \\\: \a — комбинация, особенная, обычная
  • \\\\ эха:\\ - комбинация special, special

echo напечатает полученный ряд после того, как bash интерпретирует его. Дополнительные сведения: bash документация , bash хакеры вики , POSIX спецификация .

. не имеет особого значения в bash . Это обычный персонаж для оболочки. Ниже приведены последовательности, относящиеся к вашим примерам:

  • echo. : .
  • эхо\. : .
  • эхо\\. : \.
  • эхо\\\. : \.
  • эхо\\\\. : \\.

Более простое решение для литерала последовательностей в bash

Для передачи параметров буквально по bash можно использовать одинарную кавычку ' escaping. Между одиночными кавычками вам не нужно заботиться об особом значении символов, потому что одиночная кавычка является единственным символом с особым значением там. После включения первой части последовательности можно вставить одну кавычку. Пример:
echo 'part1 '\" part2' : part1 'part2

Regex in grep

\ - символ побега со значением, аналогичным значению в bash . . - это специальный символ, который представляет собой единственное вхождение любого символа . См. regex POSIX , GNU grep regex . Примеры регексных выражений:

  • . - соответствует любому символу, например a или .
  • \. - соответствует только . буквально

Ваши примеры

На второй строке каждого примера ниже вы найдете эквивалент с одиночными кавычками ', показывающими, какой литерал последовательности передается bash в grep . После выполнения команды grep единственным возможным специальным символом в примерах является . , соответствующий любому символу. На третьей строке находится описание того, что соответствует выражению.

  • grep например < < < < «это, например,»
    grep 'например' < < < < «это, например, wow»
    e любой символ g любой символ - соответствует , например и, возможно, другие последовательности типа eagb
  • grep e\.g\. < < < "Это, например,"
    grep 'например' < < < "это, например," wow "
    e любой символ g любой символ - соответствует , например и, возможно, другие последовательности , такие как exgy
  • grep e\\.g\\. < < < «это, например,»
    grep «e\.g\». < < < «это, например, вау»
    , например буквально - соответствует , например только
  • grep e\\\.g\\\. < < < «это, например,»
    grep «e\.g\». < < < «это, например, вау»
    , например буквально - соответствует , например только
  • grep e\\\\.g\\\\. < < < «это, например,»
    grep 'e\\.g\\.' < < < "это, например,wow "
    e\ любой символ g\ любой символ - не соответствует , например
0
27.01.2020, 20:01

Теги

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