Как удалить все строки в файле до совпадения узор строки строки? [дубликат]

Предложение: используйте инструменты, поддерживающие xml / html:

xmllint

curl "$url" | xmllint -html -xpath '//span/strong[2]/text()' - 

xidel

curl "$url" | xidel -s -e "//span/strong[2]" -

или даже

xidel -e "/span/strong[2]" $url
1
17.09.2018, 22:02
5 ответов

Вы можете сделать это:

cat test.txt | grep -A2 "pen test/ut" | sed "1 d"
The sixth line
The seventh line
1
27.01.2020, 23:23

С Perl:

perl -ni.bck -e '$i++,next if /^pen test/;print if $i' file

Это читает ваш входной файл и выполняет обновление в -месте. Исходный файл сохраняется с расширением суффикса .bck.

При чтении каждой строки файла устанавливается флаг $i, если строка начинается с pen testи читается следующая строка. Когда $iне равно нулю (истинное условие ), строки печатаются.

Если вы хотите извлечь интересующие строки, а не обновлять их, просто выполните:

perl -ne '$i++,next if /^pen test/;print if $i' file
0
27.01.2020, 23:23

Написав ответ с помощью сценария оболочки с использованием split и sed, я вспомнил команду оболочки csplit (context split ).

Я сохранил ваш текст выше в /tmp/del.me. Команда:

csplit del.me "/pen test/"

разбивает исходный файл на два файла, один с текстом до совпадения, другой с текстом, включающим и последующим.

host:tmp me$ cat xx01
pen test/ut
The sixth line
The seventh line

Если совпадение вам не нужно, вы можете добавить «+1» к аргументу совпадения, и совпадающий текст будет помещен в первый файл.

csplit del.me "/pen test/+1"

Итак, приведенная выше команда дает мне два выходных файла xx00 xx01. (Вы можете изменить имя файла. )xx01 содержит:

host:tmp me$ cat xx01
The sixth line
The seventh line
0
27.01.2020, 23:23

Для этого можно использовать утилиты sedи Perlследующим образом:

perl -ne '
  next unless /pen/;  #  skip till we meet the first interesting record
  print <>;           # <> in the list context, fetches the entire remaining file
' input-file.txt

sed -ne '
   /pen/!d
   n
   :loop
      $!N;P;s/.*\n//
   tloop
' input-file.txt

sed -ne '
   /pen/!d  ;# reject lines till we see the first interesting line
   n        ;# skip the first time we see the interesting line
   :n       ;# then setup a do-while loop which"ll do a print->next->print->... till eof
      p;n   ;# the looping ends when the n command tries to read past the last record
   bn
' input-file.txt
1
27.01.2020, 23:23

С помощью GNU sed :удалите все до первого совпадения и измените файл в -месте:

sed -i '0,/pen test/d' test.txt
3
27.01.2020, 23:23

Теги

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