我想编写一个脚本,对其输入执行以下操作:匹配模板中的单词,并将其替换为相应的等效单词(或“翻译”)。
我使用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.发布于 2012-08-17 12:48:11
因为您的字典已经是用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"但是,由于您的字典必须以增量方式应用,因此最终会生成与字典中的规则不匹配的中间字符串。
https://stackoverflow.com/questions/11999370
复制相似问题