Bash脚本查找匹配文件的替换多行代码

时间:2019-03-05 09:41:44

标签: bash macos

Sed简直太恐怖了,所以我一直在整理一个小的Shell脚本,这样我就可以编写一次,而不必再次编写。 (我不想使用sed)

这是我到目前为止所拥有的

echo -e "OLD string - ctrl + d when done: \n"
oldstring="$(cat)"

echo -e "NEW string - ctrl + d when done: \n"
newstring="$(cat)"

echo -e "Renaming all instances of: \n\n$oldstring\n\n to: \n\n$newstring"
read -p "Is this correct (y/n) " -n 1 -r
echo ""

echo "Beginning changes"

if [[ $REPLY =~ ^[Yy]$ ]]
then
  find . -type f -name '*.js' -exec sed -i "" "s@$oldstring@$newstring@g" {} +
    echo "Done"
fi

这样做的妙处在于,它适用于简单的匹配,例如将“ name”替换为“ bob”。

问题是当我要粘贴多行代码段时,例如输入:

    return this.executeFn(params).then(results => {

      resultStore[name] = results.result;

      return results;
    });

替换为:

    return this.executeFn(params).then(
      results => {console.log(results);}
    );

我猜我需要以某种方式自动转义oldstring和newstring中的所有字符,因此sed理解之前和之后吗?

如果有更简单的方法,我可以使用其他工具。我只是想避免不得不编辑±300个文件来进行这样的更改。

“重复” sed标签无济于事。 Sed只是我正在探索的一个选项,而另一个线程中的答案建议手动编辑和转义字符串的一部分。 bash脚本不可选。

1 个答案:

答案 0 :(得分:0)

这是因为sed自然不适用于多行模式。有一种非常相反的直观方法可以使它起作用,但是老实说,最好的选择是使用perl,如本post on Unix/linux SE所示。

要使用sed替换perl命令,可以使用以下命令:

perl -i -0pe "s/$oldstring/$newstring/g"

标志说明:

  • -i:就地版
  • -0\0分行(多行模式匹配所需)