2016-10-22 10 views
0

ファイル内の文字列を検索したい場合、検索文字列が見つかった場合は、中括弧で値に基づいて3行を置換します。私は、スタックオーバーフロー一致するパターンが見つかったら追加する方法と行

Perl - Insert lines after a match is found in a file から解決策の1つを介して行っていた

が、発見されたイン・ファイル

しかし、物事は私のために INPUT_FILE働いていない。

abcdef1{3} { 0x55, 0x55, 0x55 } 
abcdef2{2} { 0x55, 0x55} 

コード:

use strict; 
use warnings; 
my $ipfile = 'input.txt'; 
open my $my_fh "<", $ipfile or die "Couldn't open input file: $!"; 
while(<$my_fh>) 
{ 
if (/$abcdef1/) 
{ 
s/abcdef1{3} {\n/abcdef1{3} {\nabcdef1 0x55\nabcdef1 0x55\nabcdef1 
0x55\n/gm; 

} 
} 

予想される出力:

abcdef1 0x55 
abcdef1 0x55 
abcdef1 0x55 
abcdef2 0x55 
abcdef2 0x55 

説明に役立つと感謝します。

+0

一見すると、 's/abcdef1 {3} {\ n/...}の最初の2つのcurlies' {} 'をエスケープする必要があります。それ以外の場合は、 'abcdef'の後に' 1 'の3文字、すなわち 'abcdef111'が続く。 's/abcdef1 \ {3 \} {\ n/...'を試してください。 – PerlDuck

+0

は条件が満たされていないように見えます。 – sam

+0

ああ、私はそれを逃した。あなたは 'use strict/warnings'を追加しました。あなたは警告を受けていませんでしたか?私は 'if(/ $ abcdef1 /)'が変数 '$ abcdef1'を補間しようとしていると思います。ドルをエスケープする:if(/ \ $ abcdef1 /) ' – PerlDuck

答えて

3
perlre

注意とRE.info${ ... }を使用していることは、正規表現内で特別な意味を持っています。少なくとも1つのprint文がないため、出力が表示されないことがあります。 2番目のエンクロージャーのシリーズの長さを検証する場合を除き、最初の中かっこ(つまり:{\d+})はオプションです。

あなたのループのようなものに見えることがあります。

while (<$my_fh>) { 
    if (/ 
    ^    # beginning of line 
     ([^{]+)   # the base pattern captured in $1 ("non-left curly braces") 
     .*    # any number of characters 
     \{\s*(.*?)\s*\} # the data section surrounded by curlies captured in $2 
     $    # end of line 
     /x)   # allow whitespace and comments 
    { 
    for my $val (split /, /, $2) { 
     print "$1 $val\n"; 
    } 
    } else { 
    print; 
    } 
} 

以上簡潔に:

while (my $line = <$my_fh>) { 
    if ($line =~ /^([^{]+).*\{\s*(.*?)\s*\}$/) { 
    $line = ''; 
    $line .= "$1 $_\n" for split /, /, $2; 
    } 
    print $line; 
} 

パターン.*??は非欲張り一致を示します。この場合、2番目の右中かっこの隣にある空白のマッチングを避けます。

+0

'[^} \ s](?:[ ^}] * [^} \ s])? 'は'。*? 'の信頼できる置換えです。 – ikegami

+0

私は最初のアプローチで試しましたが、望ましい出力を得られませんでした。 – sam

+0

私は2番目のアプローチも試みましたが、それは動作しません。 – sam

関連する問題