首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:使用字典模板替换文件中的多个单词?

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

Stack Overflow用户
提问于 2012-08-17 11:27:19
回答 1查看 760关注 0票数 0

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

我使用case esac作为字典模板,在调用sed进行替换之前,我尝试将其放入循环中,但我不确定从哪里开始以及如何开始。如何用bash脚本中模板字典的定义替换文件内容的一部分?

输入(包含以下内容的文件):

代码语言:javascript
复制
Sliced bread is the best thing since bread slicers.

字典模板:

代码语言:javascript
复制
case "$@" in
sliced) Peanut butter ;;
bread) sandwiches ;; 
is) are ;;
"the best thing") even better. ;;
since bread slicers) "";;
*) "$@" ;; esac

所需输出:

代码语言:javascript
复制
Peanut butter sandwiches are even better.
EN

回答 1

Stack Overflow用户

发布于 2012-08-17 12:48:11

因为您的字典已经是用bash编写的,所以您可以标记输入流并将每个单词独立地传递给您的字典。然而,由于您坚持在您的单词中允许空白(就像在"the best thing"中一样),标记化方法将不起作用。因此,您必须解析字典并根据字典构造sed表达式。

现在,假设最后一行中唯一的非字母数字/空白字符是*,您可以这样做:

代码语言:javascript
复制
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"

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11999370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档