2017-09-01 3 views
1

単一のテキストファイルの情報ブロックを新しいファイルや、各ブロックのデータを操作できる形式に抽出する手助けが必要です。複数のテキストブロックを新しいファイルに抽出する

例:

[Block1] 
this=that 
here=there 
why=why_not 

[Block2] 
this=those 
here=there 
why=because 

私は(私は右のいずれかを隔離することができれば、私が行うことができます)変数を表示および/または操作できるようにする必要があります。これらのブロックのそれぞれを一時ファイルに書き込んでも構いません。

here=therehere=anywhereに変更するにはどうすればよいですか?Block2

私はこれをsed/awkを使って調べようとしましたが、役に立たなかった。 Perlを使用

+0

ブロックを後で再結合するのはどうですか?ブロックの順序は重要ですか? –

+0

このユースケースではありません。 – Chip

答えて

0

解決策:

perl -00 -pe '/^\[Block2\]\n/ or next; s/^here=there$/here=anywhere/m' 

-p(SEDと同様に)暗黙の入力/出力ループ内のコードをラップするPerlを伝えます。

-00は、(行ではなく)段落単位で入力を処理するようにperlに指示します。

-e ...は、プログラムを指定します。最初に段落が[Block2]で始まることを確認します(それ以外の場合はすべての処理をスキップします)。次に、here=thereという形式の行をhere=anywhereに置き換えます。 SEDで

+0

あなたはファイル名が必要です... –

+0

@ MarkSetchell必ずしもそうではありません。ファイル名がなければstdinから読み込むだけなので、例えばパイプラインの一部として使うことができます。 – melpomene

+0

私はそれを知っていますが、あなたはそれを知っていますが、私はOPがあなたの答えをどのように使うべきか分からないことを示唆しており、少し説明するのに役立つかもしれません。 –

4

sed '/^\[Block2\]/,/^$/s/here=there/here=anywhere/' file 
  • /^\[Block2\]/,/^$/s/here=there/here=anywhere/
  • ...次の空白行( ^$)またはファイルの末尾に [Block2]で始まる行の間: here=anywherehere=there置き換える
+0

で始まります。 'sed'はブロック処理のための指定ツールです。 –

+0

ファイル形式に関する前提が正しくない場合はどうなりますか。 INIファイルは、 '='の後ろに空白があってもなくてもよく、次のセクションの前に空白のファイルがないかもしれません。 –

+0

@RedCricket 's/here * =。*/here = anywhere /' – Kusalananda

0

私はConfig::IniFiles Perlモジュールを使用したいと思います。 Ubuntuはapt-get ...を使用するために

$ sudo yum install perl-Config-IniFiles 

:あなたがRedHatのかCentOSにシステム上で実行している場合は、これを試してみてください。

ここでコンフィグからサンプルスクリプトの修正版::をIniFileの概要です:

$ cat syn.pl 
#!/bin/perl -w 

use strict; 

use Config::IniFiles; 
my $cfg = Config::IniFiles->new(-file => "./inifile.ini"); 
print "The value is " . $cfg->val('Block2', 'here') . ".\n" 
    if $cfg->val('Block2', 'here'); 

は、ここで実行する例を示しますBlock2hereを変更

$ cat inifile.ini 
[Block1] 
this=that 
here=there 
why=why_not 

[Block2] 
this=those 
here=there 
why=because 
$ ./syn.pl 
The value is there. 

は簡単です:

$ cat rewrite.pl 
#!/bin/perl -w 

use strict; 

use Config::IniFiles; 
my $cfg = Config::IniFiles->new(-file => "./inifile.ini"); 
print "The value is " . $cfg->val('Block2', 'here') . ".\n" 
    if $cfg->val('Block2', 'here'); 
$cfg->setval('Block2', 'here', 'anywhere'); 
$cfg->RewriteConfig(); 
$ cat inifile.ini 
[Block1] 
this=that 
here=there 
why=why_not 

[Block2] 
this=those 
here=there 
why=because 
$ ./rewrite.pl 
The value is there. 
$ cat inifile.ini 
[Block1] 
this=that 
here=there 
why=why_not 

[Block2] 
this=those 
here=anywhere 
why=because 
1

これはあなたのためにファイルをblock1という名前のファイルに分割します。ブロック2などあなたがブロック2に必要な変更を行い、すべてのUNIXボックス上の任意のawkで動作します:GNUと

awk -v RS= -F'\n' ' 
{ 
    close(out) 
    out = "block" NR 
    if ($1 == "[Block2]") { 
     sub(/here=there/,"here=anywhere") 
    } 
    print > out 
} 
' file 

がそれをawkはさえ簡潔です:

awk -vRS= -F'\n' '$1=="[Block2]"{sub(/here=there/,"here=anywhere")} {print>("block"NR)}' file 
0

最初のINSERTが「ここどこでも=」し、その後削除しますダブレット。

awk '/this=those/{print;print "here=anywhere";next}!($0 in a) {a[$0];print}' file 

[Block1] 
this=that 
here=there 
why=why_not 

[Block2] 
this=those 
here=anywhere 
why=because 
関連する問題