空白(例: "")または改行(キャリッジリターンなど)を下線で置き換えます - 特別な場合

空白(例:

特別な場合、つまり、2つの特定の文字列の間にスペース(たとえば "")または改行(キャリッジリターンなど)を下線で置き換えたいと思います。

HTMLページがあり、空白と新しい行が2つの特定の文字列の間に表示されるときに下線に置き換えたいと思います。

例:

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...

基本的に私はただ文字列がago欲しい<http

重複したHTMLなので、機能させると、後で修正されたテキストを抽出するのが非常に役立ち、簡単になります。

sedまたはawkを使用するのが私に最適です。

ベストアンサー1

「月前」と「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::]]代わりに使用しました。 2番目の置換では、改行文字を含むすべての種類のスペースを置き換えたいと思います(直前のスペースとandの間のスペースを除く)。\ss///months agomonthsago

出力:

lots of text...
page_5.html months ago___This_is_the_password:_6743412_<http://website.com_etc...
more text...

以下を使用して1行で書くこともできます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

おすすめ記事