Замена пробелов (например, «») или новых строк (например, возврата каретки) на символы подчеркивания - особый случай

Я хочу заменить пробелы (например, "") или новые строки (например, возврат каретки) символами подчеркивания в особом случае - когда они встречаются между двумя конкретными строками.

У меня есть 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.

0
08.05.2016, 11:13
4 ответа

Предполагая, что вы имеете в виду «между« месяцами назад »и« 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
0
28.01.2020, 04:51

Фрагмент 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 - это желаемая часть, в которой необходимо выполнить замену. Наконец, файл печатается по желаемому шаблону.

0
28.01.2020, 04:51

используйте vim, одна команда из терминала сделает это:

vim -c '%s/ ago\n*/ ago__/g|wq' original.txt

original.txt будет изменен, поэтому убедитесь, что вы сначала сделали резервную копию!

0
28.01.2020, 04:51

Perl:

perl -0777 -pe 's{(?<=\bago\b)(.+)(?=<http)}{ ($repl=$1) =~ s/\s/_/g; $repl }sge' file

Notes:

  • -0777 превращает файл в одну строку
  • команда "outer" s/// находит все подстроки, которые вы хотите изменить
  • команда "inner" s/// заменяет все пробелы подчеркиванием.
0
28.01.2020, 04:51

Теги

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