部分文字列のみ変更

部分文字列のみ変更

STARTパターンで表示されたセクションの前後に無効なテキストがあるファイルEND(各特定の文字列は一度だけ表示され、同じ行に正しい順序で表示されます)。私はただSTARTの間の部分に対して文字列操作をしたいと思います。END

入力例:

aomodi3hriq32| ¶³r 0q93aoiSTART_this_is_to_be_modified_ENDaqsdofuha23uru| ²23i ii3uhfia
oawpo3<9"§ A hSTART_this_also_needs_modification_ENDqa 032/a237(°1Q"§ >A_this_
START changeme ENDnot_this_modias

- 操作に関する限り、および間sedの部分文字列(および部分文字列のみ)は、私が使用するように変更する必要があります。STARTENDsed 's/_this_// ; s/modi/MODI/ ; y/as/45/'

出力例:

aomodi3hriq32| ¶³r 0q93aoiSTARTi5_to_be_MODIfied_ENDaqsdofuha23uru| ²23i ii3uhfia
oawpo3<9"§ A hSTART4l5o_need5_MODIfic4tion_ENDqa 032/a237(°1Q"§ >A_this_
START ch4ngeme ENDnot_this_modias

awk複数の値を異なる場所に設定できないFS="START|END"ため失敗します。OFS

入れ子になったコマンドの置き換えと他の区切り文字()を試してみましたが、失敗し、コマンドの前後に文字があり、コマンドを混乱させる可能性があることもsed懸念していました(例:a)。~アイデアは、「内部」部分文字列のみを選択して操作を実行し、それを代替の一部として使用することです。STARTEND/

sed "s/^\(.*\)START.*END\(.*\)$/\1$(sed 's~^.*START~~
                                         s~END.*~~
                                         s~_this_~~
                                         s~modi~MODI~
                                         y~as~45~' infile)\2/" infile

私は例えばperl....しかし、何でも慣れていません。

sedREGEX一致サブストリング行にのみセット操作を適用する方法はありますか?

ベストアンサー1

perl -CSD -ne '
    if (my ($before, $between, $after) = /^(.*START)(.*)(END.*)/) {
        s/_this_//, s/modi/MODI/, tr/as/45/ for $between;
        print "$before$between$after\n";
    } else { print; }' -- file
  • -CSDUTF-8で入力をデコードし、出力をUTF-8にエンコードします。
  • $before代わりに、およびを使用して3つの変数、およびを埋めることができますが、$betweenより良い解決策を見つけることができませんでした。 $after/p${^PREMATCH}${^POSTMATCH}
    if (my ($s) = /START(.*)END/p) {
        s/_this_//, s/modi/MODI/, tr/as/45/ for $s;
        print "${^PREMATCH}START${s}END${^POSTMATCH}";
    } else { print; }
    

START ... END部分を1行で繰り返すことができる場合は、各行を繰り返す必要があります。

for my $part (split /(START.*?END)/) {
    if ($part =~ /^START.*END$/) {
        s/_this_//, s/modi/MODI/, tr/as/45/ for $part;
    }
    print "$part";
}

おすすめ記事