Как я отображаю данные с начала файла до первого вхождения регулярного выражения?

Как я отображаю данные с начала файла до первого вхождения регулярного выражения?

Например, если у меня есть файл, который содержит:

One
Two
Three
Bravo
Four 
Five

Я хочу начать отображать содержание файла, запускающегося в строке 1 и останавливающегося, когда я нахожу строку "B*". Таким образом, вывод должен быть похожим на это:

One
Two
Three
8
задан Cœur 30 January 2019 в 03:52
поделиться

11 ответов

sed -n '1,/^B/p'

Печать из строка 1 до / ^ B / (включительно). -n подавляет эхо по умолчанию.


Обновление: Оппс .... не хотел "Браво", поэтому вместо этого требуется обратное действие; -)

sed -n '/^B/,$!p'  

/ I3az /

6
ответ дан 5 December 2019 в 04:52
поделиться

perl -pe 'last if / ^ B /' source.txt

Объяснение: ключ -p добавляет цикл вокруг кода, превращая его в следующее:

while ( <> ) {
    last if /^B.*/;  # The bit we provide
    print;
}

Последнее ключевое слово немедленно выходит из окружающего цикла, если условие выполняется - в данном случае / ^ B /, что означает, что строка начинается с буквы B.

11
ответ дан 5 December 2019 в 04:52
поделиться

Вот однострочник perl:

perl -pe 'last if /B/' file
1
ответ дан 5 December 2019 в 04:52
поделиться

если он от начала файла

awk '/^B/{exit}1' file

, если вы хотите начать с конкретного номера строки

awk '/^B/{exit}NR>=10' file # start from line 10
7
ответ дан 5 December 2019 в 04:52
поделиться
sed '/^B/,$d'

Прочитайте это следующим образом: Удалить (d) все строки, начинающиеся с первой строки, начинающейся с "B" (/^B/), до последней строки ($).

.
5
ответ дан 5 December 2019 в 04:52
поделиться

в Perl:

perl -nle '/B.*/ && last; print; ' source.txt
2
ответ дан 5 December 2019 в 04:52
поделиться

Если Perl - возможность, вы можете сделать что-то подобное:

% perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE
0
ответ дан 5 December 2019 в 04:52
поделиться

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

sed -n '/^Bravo/q;p'
3
ответ дан 5 December 2019 в 04:52
поделиться

Ваша проблема заключается в вариации ответа в perlfaq6: Как вытащить линии между двумя паттернами, которые сами находятся на разных линиях?.


Вы можете использовать несколько экзотический оператор Perl (описанный в perlop):

perl -ne 'print if /START/ .. /END/' file1 file2 ...

Если бы вы хотели текст, а не строки, вы бы использовали

perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs' file1 file2 ...

Но если вы хотите вложенные случаи START через END, вы столкнетесь с проблемой, описанной в вопросе в этом разделе о совпадении сбалансированного текста.

Вот еще один пример использования . .:

while (<>) {
    $in_header =   1  .. /^$/;
    $in_body   = /^$/ .. eof;
# now choose between them
} continue {
    $. = 0 if eof;  # fix $.
}
2
ответ дан 5 December 2019 в 04:52
поделиться

Просто делюсь некоторыми полученными ответами:

Печатайте данные, начиная с первой строки, и продолжайте до тех пор, пока мы не найдем совпадение с регексом, затем остановитесь:

<command> | perl -n -e 'print "$_" if 1 ... /<regex>/;'

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

<command> | perl -pe '/<regex>/ && exit;'

Делаем это в sed:

<command> | sed -n '1,/<regex>/p'
2
ответ дан 5 December 2019 в 04:52
поделиться

Один вкладыш с основными командами оболочки:

head -`grep -n B file|head -1|cut -f1 -d":"` file
0
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

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