我想编写一个脚本,对其输入执行以下操作:匹配模板中的单词并用相应的等价物(或“翻译”)替换它们。
我使用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.
答案 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"
但是,由于您的字典必须以递增方式应用,因此最终会生成与字典中的规则不匹配的中间字符串。