sed `y`コマンドを一致するテキストにのみ適用できるかどうか(行全体ではなく)

sed `y`コマンドを一致するテキストにのみ適用できるかどうか(行全体ではなく)

この記事を書いた後回答私は、sedy//コマンドが完全な行ではなく一致するものにのみ適用されるようにすることができるかどうかを調べるためにインターネット検索をしました。関連コンテンツが見つかりません。

$ echo clayii | sed -e '/clayii/ y/clayk/kieio/'
kieiii

つまり、検索語(clayii)が入力行にある複数の単語のいずれかである場合、y//コマンドが適用されるようにしたいと思います。ただ行の残りの部分の代わりにその単語を使用してください。

つまり、私はこれをしたくありません:

$ echo can sed ignore everything but the matching word - clayii | 
    sed -e '/clayii/ y/clayk/kieio/'
ken sed ignore everithing but the metkhing word - kieiii

可能ですかsed?それとも、次のようなより強力なものを使うべきですかperl

答え1

いいえ、yコマンドはパターン空間で一致するすべての文字に適用されます。 POSIXによるとsed文書(強調):

[2住所]ワイ/文字列1/文字列2/
             変えるみんなにある文字の発生回数文字列1
             その文字と一緒に文字列2

オペレーティングシステム/BSDmanページ:

[2アドレス]y/文字列1/文字列2/
             変えるみんなにある文字の発生回数文字列1パターンとして
             スペースとその文字文字列2

そしてGNU sed infoページ:

はい/ソースキャラクター/対象キャラクター/
             音域どの次のいずれかの文字に一致するパターン空間の文字
             これソースキャラクターその文字と一緒に対象キャラクター

もちろん、保留バッファを使用して現在のパターンスペースを保存し、一致するものだけを保持し、パターンスペースを音訳して復元して、初期一致を結果に置き換えることもできます。

sed 'y/words/evles/' <<<'words whispered by the drows'

そして

sed 'h;s/.*\(drows\).*/\1/;y/words/evles/;G;s/\(.*\)\n\(.*\)drows\(.*\)/\2\1\3/' <<<'words whispered by the drows'

ただし、パターン/要件の追加を開始すると、状況が複雑になります。

答え2

真珠:perl -pe 's{(clayii)}{ ($new=$1) =~ tr/clayk/kieio/; $new }e' file

答え3

うまくいくようです。一種の入居/退去作業を行うだけです。

echo can ccccc ccccccccclayii sed clay ignore \
     every cclayii thing but the matching word\
     - cclayiicclayii |
sed     -e'y/ /\n/' \
-eh     -e's/\(cclayii\)\1*/ & /g;x;s// /g;s/^/ /' \
-ex     -e's//./;s/\([^ ]* *\)\{2\}/\1 /g;s/^/ /'  \
        -e'y/clayk/kieio/;G;t$' -e:$  \
        -e'/^ \n /{s///;y/ \n/\n /;}' \
-et     -e's/^ *\([^ ]*\) \(.* \n [^ ]*\) /\2\1/;t$'

can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii

…しかし、簡単ではありません。


しかし、ほとんどの複雑な問題と同様に方法2つを使用するとsed簡単です。

echo can ccccc ccccccccclayii sed clay ignore \
     every cclayii thing but the matching word\
     - cclayiicclayii |
sed -e's/\(cclayii\)\1*/\n&\n /g;G;s/^/ /'|
sed -e'/^ /!y/clayk/kieio/;/./{H;d;}' \
    -e'x;s/\n \{0,1\}//g'

can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii

関連情報