Я хочу заменить пробелы (например, "") или новые строки (например, возврат каретки) символами подчеркивания в особом случае - когда они встречаются между двумя конкретными строками.
У меня есть html-страницы, и я хочу заменить пробелы и новые строки подчеркиванием, когда они встречаются между двумя конкретными строками.
Пример:
lots of text...
page_5.html months ago
This is the password: 6743412 <http://website.com etc...
more text...
Я хочу перейти сверху вниз:
lots of text...
page_5.html months ago__This_is_the_password:_6743412_<http://website.com etc...
more text...
По сути, я хочу выполнить замену только между строками назад
и
It является повторяющимся html, поэтому, если я смогу заставить его работать, было бы очень полезно и легко извлечь измененный текст позже.
Мне лучше всего подойдет что-нибудь, использующее sed или awk.
Предполагая, что вы имеете в виду «между« месяцами назад »и« http: // », этот perl
скрипт делает то, что вы хотите:
#! /usr/bin/perl
use strict;
my $join=0;
while(<>) {
if (m/ ago$/) { $join=1 };
if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; };
if ($join == 1) {
s/\s/_/g;
s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/g;
};
print;
}
ПРИМЕЧАНИЕ: Я намеренно использовал [[: blank ::]]
, а не \ s
в первой операции s ///
выше, так что изменяются только пробелы и табуляторы в этой строке, а не новые строки. Я хочу, чтобы второй подстановкой заменил все виды пробелов, включая символы новой строки (за исключением пробела, непосредственно предшествующего месяцев назад
, и пробела между месяцами
и назад
]).
Вывод:
lots of text...
page_5.html months ago___This_is_the_password:_6743412_<http://website.com_etc...
more text...
Это также можно было бы записать в однострочном формате, используя perl -p
:
perl -p -e 'if (m/ ago/) { $join=1 }; if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; }; if ($join == 1) {s/\s/_/g}; s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/' speld.txt
Фрагмент Python:
#!/usr/bin/env python3
import re
with open('file.txt') as f:
f = f.read()
spl = re.split(r'(\sago\n|<http://)', f)
des = re.sub(r'\s', '_', spl[2])
print(spl[0] + spl[1].replace('\n', '') + des + ''.join(spl[3:]), end='')
Файл разбивается на части, принимающие назад \ n
и
re.split
. Тогда значение в индексе 2 - это желаемая часть, в которой необходимо выполнить замену. Наконец, файл печатается по желаемому шаблону.
используйте vim, одна команда из терминала сделает это:
vim -c '%s/ ago\n*/ ago__/g|wq' original.txt
original.txt будет изменен, поэтому убедитесь, что вы сначала сделали резервную копию!
Perl:
perl -0777 -pe 's{(?<=\bago\b)(.+)(?=<http)}{ ($repl=$1) =~ s/\s/_/g; $repl }sge' file
Notes:
-0777
превращает файл в одну строкуs///
находит все подстроки, которые вы хотите изменитьs///
заменяет все пробелы подчеркиванием.