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
の部分文字列(および部分文字列のみ)は、私が使用するように変更する必要があります。START
END
sed '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)。~
アイデアは、「内部」部分文字列のみを選択して操作を実行し、それを代替の一部として使用することです。START
END
/
sed "s/^\(.*\)START.*END\(.*\)$/\1$(sed 's~^.*START~~
s~END.*~~
s~_this_~~
s~modi~MODI~
y~as~45~' infile)\2/" infile
私は例えばperl
....しかし、何でも慣れていません。
sed
REGEX一致サブストリング行にのみセット操作を適用する方法はありますか?
ベストアンサー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
-CSD
UTF-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";
}