特別な場合、つまり、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の間のスペースを除く)。\s
s///
months ago
months
ago
出力:
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
答え2
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='')
ファイルはago\n
および<http://
区切り文字を使用してセクションに分割されますre.split
。その後、インデックス2の値は置き換える必要がある必須部分です。最後に、目的のパターンでファイルを印刷します。
答え3
真珠:
perl -0777 -pe 's{(?<=\bago\b)(.+)(?=<http)}{ ($repl=$1) =~ s/\s/_/g; $repl }sge' file
メモ:
-0777
ファイルを単一の文字列に結合- "outer"
s///
コマンドは、変更されるすべての部分文字列を検索します。 - "inner"
s///
コマンドはすべてのスペースを下線で置き換えます。
答え4
vim を使用すると、端末で次の 1 つのコマンドでこれを実行できます。
vim -c '%s/ ago\n*/ ago__/g|wq' original.txt
Origin.txtが修正されたのでまずはバックアップをしてください!