0

入力に対して次のことを行うスクリプトを作成したいと思います。テンプレートの単語を照合し、対応する同等の単語(または「翻訳」)に置き換えます。

sedを呼び出して置換を呼び出す前にループに入れてみた辞書テンプレートを使用case esacしましたが、どこから始めればよいのかわかりません。ファイルのコンテンツの一部をbashスクリプトのテンプレート辞書の定義で置き換えるにはどうすればよいですか?

入力(以下を含むファイル):

Sliced bread is the best thing since bread slicers.

辞書テンプレート:

case "$@" in
sliced) Peanut butter ;;
bread) sandwiches ;; 
is) are ;;
"the best thing") even better. ;;
since bread slicers) "";;
*) "$@" ;; esac

必要な出力:

Peanut butter sandwiches are even better.
4

1 に答える 1

1

辞書は既に bash で記述されているため、入力ストリームをトークン化し、各単語を個別に辞書に渡すことができます。ただし、単語内に空白を許可することを主張しているため ( のように"the best thing")、トークン化のアプローチは機能しません。したがって、辞書を解析し、sedそこから式を作成する必要があります。

ここで、非英数字/空白文字のみ*が最後の行にあると仮定すると、次のようにすることができます。

s="$(cat "dict.bash" | sed -n 's/^[ \t]*\("\?\)\([^*")]\+\)\("\?\))[ \t]*"\?\([^\/"]*[^ \t]\)"\?[ \t]*;;.*$/\2)\4/p' | while IFS=")" read pat subst; do

  echo -n "s/$pat/$subst/gi;"

done)"

sed -e "$s"

ただし、ディクショナリは段階的に適用する必要があるため、ディクショナリのルールに一致しない中間文字列が生成されることになります。

于 2012-08-17T04:48:10.850 に答える