2

Я уверен, что большинство из нас знает, что когда мы хотим, чтобы какое-то регулярное выражение совпадало со строкой в начале строки, мы должны использовать «^» ...

Но я пытаюсь понять, что на самом деле означает "пустая строка в начале строки"

Я знаю, что эхо "Hello World" | grep ^ H это соответствует

Поэтому, пожалуйста, посмотрите вывод этих команд:

[sergio@localhost ~]$ dd if=/dev/zero of=/tmp/texto  count=1 bs=1 2>/dev/null
[sergio@localhost ~]$ od -ta /tmp/texto          
0000000 nul
0000001

Пока что все как положено, так что

[sergio@localhost ~]$ echo  "Hello" >> /tmp/texto
[sergio@localhost ~]$ grep -a "^Hello" /tmp/texto 

Ну, первое, что я должен признаться, не ожидал, до того, как у Hello есть нулевой символ, так почему же он не совпадает?

Хорошо, давайте использовать grep в стиле Perl:

[sergio@localhost ~]$ grep -a -P "\x00Hello" /tmp/texto 
Hello

Хорошо, это соответствует

Но что я не понимаю (возможно, у меня есть неправильное представление), почему grep -a "^ Hello" не совпадает ...

Не могли бы вы помочь мне?

заранее спасибо!

3 ответа3

5

Вы путаете нулевой символ (двоичное значение 0) с пустой строкой.

"Пустая строка в начале строки" - это просто несуществующее (существующее) перед первым символом строки. Пустая строка в конце строки, аналогично, представляет собой аналогичный контент, найденный после последнего символа строки. Пустая строка может рассматриваться как состоящая из «пустой строки, пустой строки», тогда как строка с некоторым содержанием может рассматриваться как «пустая строка, Hello world, empty string».

Строка в C представлена в виде последовательности ненулевых байтов, за которыми следуют один или несколько 0 байтов, что указывает на завершение строки, но полностью отделено от "пустой строки" в регулярном выражении parlace и действительно в значительной степени является внутренним выбором в C язык программирования и стандартная библиотека. Немногие другие языки делают это таким образом, но даже в этом случае могут представлять пустые строки.

2

"Нулевая строка" - это не то же самое, что "нулевой символ". Нулевая строка - это пустая строка, "". Нулевой символ - это символ со всеми битами, установленными в 0. Он может быть представлен в двойных кавычках как \0, поэтому результат вашей команды dd был "\0". Затем приложение сделало это "\0Hello". Это была не пустая строка. Шаблон «^ Hello» соответствует только тем строкам, которые начинаются с "Hello", а ваш - нет, потому что он начинается с «\0», а не "H".

0

Воображаемая строка из пяти символов, за которой следуют две разные строки:

^  _ _ _ _ _  $
^  H e l l o  $
^ \0 H e l l  $
  • Знак доллара и окружность не соответствуют никаким символам, они соответствуют границам строки.
  • null (\0) является реальным символом и занимает место так же, как abcd ...

Таким образом, «^ H» не будет соответствовать «\0abcd» (так же, как «^ Z» не будет соответствовать "abcd"), потому что «\0abcd» начинается с нулевого символа, а не с "H".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .