(sed)正規表現を使用して最後の文字を削除しながら、文字内のすべての項目を置き換える方法は?

(sed)正規表現を使用して最後の文字を削除しながら、文字内のすべての項目を置き換える方法は?

次の問題を解決しようとしています。正規表現をテストするには、Mac端末で次のコマンドを使用します。

echo 'inputstring' | sed (-E) '/s///g'

正規表現を作成しようとしています。

  • 単語が文字「o」で終わる場合にのみ、次のようになります。
  • この単語の末尾にある「o」を削除してください。
  • 単語内の文字「i」をすべて「a」に置き換えます。

この場合、入力文字列は次のようになり、filo fililo felo fale予想される出力は次のようになります。fal falal fel fale

削除または置換を実行する正規表現を作成できますが、それらを組み合わせる方法がわかりません。条件付き部分の間に列の半分を入れると、どのように入れるのかわかりません。

また、「単語の終わり」の場所を定義することもできません。試し\bてみましたがうまくいかないようです($文字列の終わりとは異なり)。

ベストアンサー1

私はこれを使用しませんが、sedこれが学習練習である場合は、sed次のようなループを実行します。

sed -E 's/$/ /
  :a
  s/i([[:alnum:]]*o[^[:alnum:]])/a\1/
  ta
  s/([[:alnum:]]*)o([^[:alnum:]])/\1\2/
  ta
  s/ $//'
  • 最初の行では、行の末尾を他の単語の終わりと同じように処理できるように、末尾にスペースを追加しました。最後の行は後で対応するスペースを削除します。
  • 3行目のコマンドは、sで終わる単語を検索してに置き換えます。コマンドはトークンに戻り、すべての終わりの単語のすべての単語に対してこの操作を繰り返します。ioat:aio
  • 5行目では、エンディングとo別のループを削除します。で終わる単語はooすべて削除されます。これが私たちが望むものであるかどうかはわかりません。

ちなみに私はsedcommand ooptions をサポートするバージョンを使用しておりs、一致する部分だけ保持して残りは捨てます。また\h、交換時にスペースを保存するコンテンツに置き換える方法も知っています。これにより作業が簡単になります。

sed -E ':a;h;s/([[:alnum:]]*)o($|[^[:alnum:]])/\1\2/o;T;y/i/a/;x;s//\h/;ba'

おすすめ記事