Как удалить текст между двумя ключевыми словами в текстовом файле

Попробуйте это:

sudo apt --fix-broken install
sudo apt-get update
sudo apt-get upgrade
0
19.10.2021, 08:43
2 ответа

Использование Raku (, ранее известного как Perl _6)

raku -ne '.put unless /keyword1/ ^fff^ /keyword2/;'

Пример ввода:

bla bla
...
bla bla
keyword1
bla bla
...
bla bla
keyword2
bla bla
...
bla bla

Пример вывода:

bla bla
...
bla bla
keyword1
keyword2
bla bla
...
bla bla

Вкратце, флаги командной строки Raku -neговорят Raku выполнять код без автопечати. Печать выполняется с помощью первой инструкции.put(«печать -с использованием терминатора -», то есть новой строки ). Точка ., предшествующая put, является сокращением от $_.put, где $_представляет в данном случае переменную темы (, содержащую данные из строки ввода ).

Инструкция fff— это оператор Раку sed -, аналогичный оператору «флип -флоп», который включает/выключает на основе двух окружающих регулярных выражений. В Raku (и Perl5 )unlessявляется псевдонимом if not. Наконец, ^символы вставки, окружающие fff, дают ^fff^указание Raku исключить конечные точки.

Поскольку unlessявляется отрицанием, ^fff^отменяет исключение конечных точек, что сохраняет keyword1и keyword2в выходных данных. Использование fffвместо ^fff^удаляет keyword1и keyword2из вывода.

(Обратите внимание: если вы действительно хотите разобрать файл XML, то одно решение Raku -лайнера можно создать с помощью модуля Raku XML).

https://unix.stackexchange.com/search?q=Raku+%5BXML%5D
https://github.com/raku-community-modules/XML
https://raku.org

0
19.10.2021, 11:54

Предыдущее предложение относительно sed не даст ожидаемых результатов, если «ключевое слово» не является единственным словом в строке. Если вы хотите извлечь текст между любыми двумя словами из любого абзаца, независимо от их положения, вам понадобится Perl, в частности Perl's File Slurp

Например, допустим, у нас есть этот текст:

Sir Arthur Conan Doyle was born on May 22, 1859, in Edinburgh. 
He studied medicine at the University of Edinburgh and began to write stories while he was a student. 
Over his life he produced more than 30 books, 150 short stories, poems, plays, and essays across a wide range
of genres. 
His most famous creation is the detective Sherlock Holmes, who he introduced in his first novel, A Study in Scarlet (1887). 
This was followed in 1889 by an historical novel, Micah Clarke.

Мои ключевые слова здесь — «медицина» и «Холмс» соответственно.

Результаты с sed удалит ровно первую и последнюю строки из абзаца. В то время как ожидаемый результат должен также удалить часть предложения, которая находится до и включая medicine, плюс после и включая Holmes.

Давайте попробуем Perl's File Slurp:

perl -0777 -i -pe 'push @a,/medicine(.*?)Holmes/s;END{print "@a"}' myparagraph.txt

Выход:

at the University of Edinburgh and began to write stories while he was a student. 
Over his life he produced more than 30 books, 150 short stories, poems, plays, and essays across a wide range
of genres. 
His most famous creation is the detective Sherlock 
0
19.10.2021, 13:04

Теги

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