0

我想编写一个脚本,对其输入执行以下操作:匹配模板中的单词并将它们替换为相应的等价物(或“翻译”)。

我用于case esac字典模板,我尝试在调用 sed 进行替换之前将其放入循环中,但我不确定从哪里开始以及如何去做。如何用 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 编写,因此您可以标记输入流并将每个单词独立地传递给您的字典。但是,由于您坚持在单词中允许空格(例如 in "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 回答