如何在没有sed的情况下查找和替换文件中的字符串
How to find and replace string in a file WITHOUT sed
这是我的设置存储库,我在新 linux 安装和公司提供的 mac 书籍中使用。我有这个 makefile 目标:
omz-theme:
sed -i 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
这在 linux 上工作正常,但在 mac 上会中断,因为它们使用 BSD 的 sed
。我需要一些方法来查找和替换 .zshrc
中的文本,无论系统如何,这些文本都会 运行。几乎所有在线资源都只指向 sed。
编辑:这就是它在 mac 上“中断”的方式。如果我执行 brew install gnu-sed
并将目标更改为使用 gsed
,则不会发生
sed: 1: "/Users/username/.zshrc": unterminated substitute pattern
您也可以使用 awk
进行查找和替换。 Here's a resource with more detail..
例如,您的 makefile 命令可以替换为:
omz-theme:
awk -v var="ZSH_THEME=$(echo THEME)" '{sub(/^ZSH_THEME=.*$/, var); print}' $(HOME)/.zshrc
您可以使用它通过重定向覆盖现有的 $(HOME)/.zshrc
文件:
omz-theme:
awk -v var="ZSH_THEME=$(echo THEME)" '{sub(/^ZSH_THEME=.*$/, var); print}' $(HOME)/.zshrc > $(HOME)/.zshrc
或者,您可以 check the OS using OSTYPE
然后对 BSD 和 GNU 使用正确的 sed
语法:
omz-theme:
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
sed -i 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
else
sed -i '' 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
fi
(注意:我没有测试上面的内容,但你明白了)
这是我的设置存储库,我在新 linux 安装和公司提供的 mac 书籍中使用。我有这个 makefile 目标:
omz-theme:
sed -i 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
这在 linux 上工作正常,但在 mac 上会中断,因为它们使用 BSD 的 sed
。我需要一些方法来查找和替换 .zshrc
中的文本,无论系统如何,这些文本都会 运行。几乎所有在线资源都只指向 sed。
编辑:这就是它在 mac 上“中断”的方式。如果我执行 brew install gnu-sed
并将目标更改为使用 gsed
sed: 1: "/Users/username/.zshrc": unterminated substitute pattern
您也可以使用 awk
进行查找和替换。 Here's a resource with more detail..
例如,您的 makefile 命令可以替换为:
omz-theme:
awk -v var="ZSH_THEME=$(echo THEME)" '{sub(/^ZSH_THEME=.*$/, var); print}' $(HOME)/.zshrc
您可以使用它通过重定向覆盖现有的 $(HOME)/.zshrc
文件:
omz-theme:
awk -v var="ZSH_THEME=$(echo THEME)" '{sub(/^ZSH_THEME=.*$/, var); print}' $(HOME)/.zshrc > $(HOME)/.zshrc
或者,您可以 check the OS using OSTYPE
然后对 BSD 和 GNU 使用正确的 sed
语法:
omz-theme:
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
sed -i 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
else
sed -i '' 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
fi
(注意:我没有测试上面的内容,但你明白了)