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脚本不可选。
答案 0 :(得分:0)
这是因为sed自然不适用于多行模式。有一种非常相反的直观方法可以使它起作用,但是老实说,最好的选择是使用perl,如本post on Unix/linux SE所示。
要使用sed
替换perl
命令,可以使用以下命令:
perl -i -0pe "s/$oldstring/$newstring/g"
标志说明:
-i
:就地版-0
:\0
分行(多行模式匹配所需)