次の問題を解決しようとしています。正規表現をテストするには、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
で終わる単語を検索してに置き換えます。コマンドはトークンに戻り、すべての終わりの単語のすべての単語に対してこの操作を繰り返します。i
o
a
t
:a
i
o
- 5行目では、エンディングと
o
別のループを削除します。で終わる単語はoo
すべて削除されます。これが私たちが望むものであるかどうかはわかりません。
ちなみに私はsed
command o
options をサポートするバージョンを使用しておりs
、一致する部分だけ保持して残りは捨てます。また\h
、交換時にスペースを保存するコンテンツに置き換える方法も知っています。これにより作業が簡単になります。
sed -E ':a;h;s/([[:alnum:]]*)o($|[^[:alnum:]])/\1\2/o;T;y/i/a/;x;s//\h/;ba'