この記事を書いた後回答私は、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。
[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