Perlを使用した条件付き置換

Perlを使用した条件付き置換

非常に単純な仮想の質問です。

限界に達し、条件付き置換のためのsedスクリプトsedperlsed

sed '/condition/ s/xx/yy/'

Perlでどのように実装しますか?

たとえば、Perlで次のことを行う方法は?

seq 6 > /tmp/tf

$ paste -d '' /tmp/tf /tmp/tf | sed -E '/[135]/s/^(.)(.)$/\1.\2-/'
1.1-
22
3.3-
44
5.5-
66

$ paste -d '' /tmp/tf /tmp/tf | perl -pe 's/$&/$1.$2-/ if /^([135])(.)$/'
.-
22
.-
44
.-
66

答え1

目標は入力を減らし、Perlとsedsed

sed '/^\([135]\)\(.\)$/ s//\1.\2-/'
perl -pe '/^([135])(.)$/ && s//$1.$2-/'

コマンドの空s///の正規表現は、以前のテストの式(通常は最も近い一致式)を再利用します。

&&Perlでは、テストと交換の間に短絡文のように動作するように追加する必要がありますif。のsed最初の式は単に次のように動作します。住所交換コマンド。

一般的に言えば、

sed '/condition/ s/xx/yy/'

..."同じ"です(少し異なる構文と正規表現スタイルを考慮)。

perl -pe '/condition/ && s/xx/yy/'

ただし、この場合、代替項目を直接適用する方が簡単です。

sed 's/^\([135]\)\(.\)$/\1.\2-/'
perl -pe 's/^([135])(.)$/$1.$2-/'

答え2

問題は、$1背中がすべての新しい正規表現でリセットされるため、コマンドで繰り返さない限り空であることですs

s/^([135])(.)$/$1.$2-/ if /^([135])(.)$/'

以下を削除して簡素化できますif

s/^([135])(.)$/$1.$2-/

より一般的な場合は、キャプチャされた値を保持できます。

if (/^([135])(.)$/) { $a=$1; $b=$2; s/$&/$a.$b-/; }

答え3

使用幸せ(以前のPerl_6)

raku -pe 's/^ (<[135]>) (.) $/$0.$1-/;'  

または

raku -pe 's/^ (.) (.) $/$0.$1-/ if  m/^ <[135]> /;'  

#Immediately above being a re-arrangement of:

raku -pe 'if m/^ <[135]> /  {s/^ (.) (.) $/$0.$1-/};' 

Rakuを使用しているPerlユーザーに役立つことを願ってこの記事を投稿してください。キャプチャが始まるRakuでは...表記法$0を使用して文字クラスが生成されます(角括弧はグループ化のために単独で予約されています)。そして、マッチングは通常空白(つまりPerl5のデフォルト値)を区別しません。<[]>\x

@Kusalanandaの最初のPerl5コード例(上記のRaku 'accent'を使用)を試みると、Rakuエラーが発生しますNull regex not allowed。したがって、上記の最初のRakuの答えは@Kusalanandaの答えと似ています。最後Perl5コードの例。 (上記の2番目のRakuの答えはif条件文を使用していますが、一部のユーザーはそれをより読みやすくすることができます。)

入力例:

11
22
33
44
55
66

出力例:

1.1-
22
3.3-
44
5.5-
66

付録:OPが接続用のサンプルデータを公開した後まったく同じ数字 - ここに答えがない質問があるかどうか疑問に思います。逆参照。 Rakuで一致の最初のキャプチャ(演算子の左などs///)を再利用するには、次のようにします。

raku -pe 's/^ (<[135]>) $0 $/$0.$0-/;'  

または

raku -pe 's{^ (<[135]>) $0 $} = "$0.$0-";'  

または(以下ではキャプチャと呼びます):

raku -pe 's/^ $<myOdd>=<[135]> $<myOdd> $/$<myOdd>.$<myOdd>-/;' 

または

raku -pe 's{^ $<myOdd>=<[135]> $<myOdd> $} = "$<myOdd>.$<myOdd>-";'  

上記の2番目と4番目の例では、Rakuの新しい「代替割り当て」表記を使用しています。この表記法は、(読みやすくするために)かっこ、中括弧など、さまざまな区切り文字を使用することもできます。 (もちろん、if前述のように別の条件)セクションが、これはコードの読みやすさを低下させる可能性があります。)

https://raku.org/archive/rfc/144.html
https://raku.org/archive/rfc/331.html
https://raku.org

関連情報