在bash中转义高级正则表达式

时间:2017-10-05 14:51:34

标签: regex bash sed

#!/bin/bash
files=`find ./ -type f`
from='{trans("[ sometext ]")}'
to='{trans("sometext")}'

for i in $files
do
        echo "file: $i";
        sed -e 's/"$from"/"$to"/g' $i > "$i"_new;
        mv "$i"_new $i;
done

这是我的剧本。 我想在许多文件中删除trans函数中的方括号。 我不知道如何逃避该字符串中的特殊字符。

任何人都可以帮我调试一下吗?

例如:

{trans("[ sometext ]")} -->  {trans("sometext")}
{trans("[ sometext2 ]")} -->  {trans("sometext2")}
{trans("[ sometext3 ]")} -->  {trans("sometext3")}

编辑: 由于硬组合,我认为不重复。

2 个答案:

答案 0 :(得分:0)

我建议删除循环,这会给你笨拙的文件名带来麻烦,而是使用https://{jirahost}/jira/rest/api/2/issue/{issuekey}/transitions?expand=transitions.fields 来调用sed所需的最少次数:

-exec {} +

这假设您的sed版本支持find . -type f -exec \ sed -E -i.bak 's/(\{trans\(")\[ *([^ ]*) *]("\)\})/\1\2\3/g' {} + 扩展正则表达式,-E支持就地编辑(创建带后缀-i的备份)。

该模式捕获三组:

  • .bak通往开场广场的部分
  • 方括号内的
  • \{trans\("非空格字符(符合您的示例[^ ]*sometextsometext2
  • sometext3关闭方括号后的部分

中间的部分(方括号和前导/尾随空格)被删除。如您所见,需要转义各种正则表达式元字符,例如"\)\}{(

答案 1 :(得分:0)

使用bash,不需要sed。

find . -type f -exec bash -c 'for i do f="${i/[ /}";echo mv "$f" "${f/ ]/}";done' sh '{}' +