Используя grep с регулярным выражением для отфильтровывания соответствий

Очевидно, неопределенное означает, что оно не определено, но иногда оно может быть предсказуемым. Информация, которую я собираюсь предоставить, никогда не должна зависеть от рабочего кода, поскольку она, безусловно, не гарантируется, но может пригодиться при отладке.

Вы можете подумать, что вызов функции на объект указатель будет разыменовывать указатель и вызывать UB. На практике, если функция не является виртуальной, компилятор преобразует ее в обычный вызов функции, передавая указатель в качестве первого параметра этого , минуя разыменование и создавая бомбу замещения для вызываемой функции-члена , Если функция-член не ссылается ни на какие-либо переменные-члены, ни на виртуальные функции, она может быть успешной без ошибок. Помните, что последующее попадает во вселенную «неопределенного»!

Функция MFC Microsoft GetSafeHwnd действительно полагается на это поведение. Я не знаю, что они курили.

Если вы вызываете виртуальную функцию, указатель должен быть разыменован, чтобы перейти на vtable, и, конечно же, вы получите UB (возможно, но помните, что нет никаких гарантий).

40
задан Hortitude 13 December 2008 в 06:53
поделиться

2 ответа

Проблема состоит в том, что по умолчанию, необходимо выйти из Вашего | для получения надлежащего чередования. Таким образом, grep интерпретирует "foo|bar" как соответствие литеральной строке "foo|bar" только, тогда как шаблон "нечто \| панель" (с завершенным |) соответствует или "нечто" или "панели".

Для изменения этого поведения используйте флаг-E:

tail -f logFile | grep -vE 'string one|string two'

, С другой стороны, использование egrep, который эквивалентен grep-E:

tail -f logFile | egrep -v 'string one|string two'

кроме того,-e является дополнительным, если Ваш шаблон не начинается с литерального дефиса. grep автоматически берет первый аргумент неопции в качестве шаблона.

63
ответ дан Adam Rosenfield 23 September 2019 в 16:38
поделиться

Необходимо выйти из символа вертикальной черты, когда-e используется:

tail -f logFile | grep -ve "string one\|string two"

РЕДАКТИРОВАНИЕ: или, как @Adam, на который указывают, можно использовать флаг-E:

tail -f logFile | grep -vE "string one|string two"
5
ответ дан Community 23 September 2019 в 16:38
поделиться
Другие вопросы по тегам:

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