Это действительно зависит от того, что точно Вы пытаетесь выполнить.
Система. ComponentModel. Материал TypeDescriptor может использоваться для добавления атрибутов к типам, свойствам и экземплярам объектов, и он имеет ограничение, что необходимо использовать его для получения тех свойств также. Если Вы пишете код, который использует те атрибуты, и можно жить в рамках тех ограничений, то я определенно предложил бы его.
, Насколько я знаю, управление PropertyGrid и поверхность для дизайна Visual Studio являются единственными вещами в BCL, которые используют материал TypeDescriptor. На самом деле это - то, как они делают приблизительно половину вещей, которые они действительно должны сделать.
Вместо grep
вы можете использовать pcregrep
, который поддерживает многострочные шаблоны
pcregrep -M 'second\nthird' file
-M
позволяет шаблону соответствовать более чем одному линия.
Аннотация вашего вопроса "bash grep newline" подразумевает, что вы хотите сопоставить вторую \ nthird
последовательность символов - то есть что-то, содержащее новую строку внутри нее.
Так как grep работает с «строками», а эти две разные строки, вы не сможете сопоставить его таким образом.
Итак, я бы разделил его на несколько задач:
вы сопоставляете строку который содержит "second" и выводит строку, которая соответствует, и последующую строку:
grep -A 1 "second" testfile
вы переводите все остальные символы новой строки в последовательность, которая гарантированно не встречается во вводе. Я думаю, что самый простой способ сделать это - использовать perl:
perl -npe '$ x = 1- $ x; s / \ n / ## UnUsedSequence ## / if $ x; '
вы вводите grep в этих строках, на этот раз ищите строку ## UnUsedSequence ## third
:
grep "## UnUsedSequence ## third"
вы разворачиваете неиспользуемые последовательности обратно в символы новой строки, sed может быть самым простым:
sed -e 's / ## UnUsedSequence ## / \ n'
Таким образом, результирующая команда конвейера для выполнения того, что вы хотите, будет выглядеть так:
grep -A 1 "second" testfile | perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;' | grep "##UnUsedSequence##third" | sed -e 's/##UnUsedSequence##/\n/'
Не самая элегантная на сегодняшний день, но должна работать. Хотя мне любопытно узнать о подходах получше - они должны быть.
Я не думаю, что grep - это способ сделать это.
Если вы просто хотите удалить первую строку из любого файла (чтобы обобщить ваш вопрос ), Я бы использовал вместо него sed .
sed '1d' INPUT_FILE_NAME
Это отправит содержимое файла на стандартный вывод с удаленной первой строкой.
Затем вы можете перенаправить стандартный вывод в другой файл для захвата результаты.
sed '1d' INPUT_FILE_NAME > OUTPUT_FILE_NAME
Это должно сработать.
Если вам нужно использовать grep , и вы просто не хотите отображать на нем строку с сначала , попробуйте следующее:
grep -v first INPUT_FILE_NAME
Передавая переключатель -v , вы сообщаете grep показать вам все , кроме выражения, которое вы передаете. Фактически покажите мне все, кроме строк с первым в них.
Однако
Я не совсем понимаю, что вы хотите сопоставить. Я бы не стал использовать grep, но одно из следующего:
tail -2 file # to get last two lines
head -n +2 file # to get all but first line
sed -e '2,3p;d' file # to get lines from second to third
(не уверен, насколько это стандартно, точно работает в инструментах GNU)
Значит, вам просто не нужна строка, содержащая «первый»? -v
инвертирует результаты grep.
$ echo -e "first\nsecond\nthird\n" | grep -v first
second
third
Строка? Или строки?
Попробуйте
grep -E -e '(second|third)' filename
Изменить: grep ориентирован на строку. вам придется использовать Perl, sed или awk для выполнения сопоставления шаблонов между строками.
BTW -E сообщает grep, что регулярное выражение является расширенным RE.
grep -E '(second|third)' /path/to/file
egrep -w 'second|third' /path/to/file