Bash:使用字典模板替换文件中的多个单词?

时间:2012-08-17 03:27:19

标签: bash dictionary sed translation substitution

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

我使用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.

1 个答案:

答案 0 :(得分: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"

但是,由于您的字典必须以递增方式应用,因此最终会生成与字典中的规则不匹配的中间字符串。