1

Следующее имеет смысл (хотя вы не можете видеть содержимое debug.cpp).

$ grep '^[A-Za-z_]' debug.cpp
float CheckExistence();
entity Findgoal(float gno);
void RPrint(const string& msg);
void MakeMeDebug(entity who);
void dremove(entity te)
void display_location()
void RPrint(const string& msg)
void MakeMeDebug(entity who)

Теперь, когда я добавлю .* , Как показано ниже ...

$ grep '^[A-Za-z_].*' debug.cpp

В результате я получаю 8 пустых строк (которые я не могу отобразить на этом сайте). Сильно подозревая ошибку, я обновился до последней версии grep (версия 2.25), и она делает то же самое. Я использую Ubuntu.

Если мое понимание правильное, мое регулярное выражение говорит: «Строки соответствия начинаются с букв от A до Z, без учета регистра или подчеркивания, за которыми следует что-либо, включая ничего».

Это ошибка? Или я что-то не так делаю?

1 ответ1

3

Ваш cpp находится в формате DOS, то есть его завершение строки выполняется последовательностями \r \n, и у вас есть псевдоним 'grep --color = auto', существующий для grep в вашем сеансе в то же время. Этот псевдоним помещает терминал, управляющий escape-последовательностями, вокруг соответствующей строки. Если эта строка является символом слова, то она не беспокоит вывод на терминал. Однако, если строка содержит символ возврата каретки (\r, который совпадает с последним символом. *), Это, кажется, вызывает этот побочный эффект, когда он окружен последовательностями.

Когда вызывается с использованием --color = auto, grep распознает, когда его выходные данные отправляются в pipe, а затем не окрашивает строку, следовательно, избегает побочного эффекта и появляется.

После сглаживания grep явление исчезает.

Честно говоря, это не было чем-то очевидным, потребовалось некоторое время, чтобы заставить меня подумать, почему вывод, отправленный в файл, является правильным, даже когда я использую более длинный шаблон, в то время как он ничего не показывает, когда вывод идет на терминал ,

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