我知道,很多人对如何使用sed替换字符串有疑问,但我在这里遇到困难。
我有一个文件,我需要替换一个提示用户输入内容的文本字符串。我想自动执行此操作,以便用户不进行交互。通过用静态文件路径替换此字符串。但是文本是一个bash脚本并且有'和"在我要替换的字符串中。这是行不通的。要么是因为我的格式化中存在语法错误,要么就是无法使用sed执行此操作。请指教!
以下是我尝试做的事情: 我想替换这个长字符串
var url = 'https://sites.google.com/a/test.net/';
var site = SitesApp.getSiteByUrl(url);
var infos = {"title": site.getTitle(), "summary": site.getSummary()};
var page = site.getChildByName("home");
var content = page.getHtmlContent();
带有如下所示的字符串:
read -e -p 'Enter path for Boot Partition : ' BOOTUSERFILEPATH
我的尝试:
BOOTUSERFILEPATH=../board-support/prebuilt-images
更新:我修复了语法错误,但文件仍未使用新路径信息更新... :(
发现了这个问题。搜索没有找到字符串,因为我的搜索命令中有额外的空格。它现在有效!答案 0 :(得分:2)
字符串中有正斜杠,因此需要使用不同的delmiter。我在这里使用' |'作为分隔符。
sed "s|read -e -p \'Enter path for Boot Partition : \' BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g" oldfile > newfile
您可能会注意到,允许编辑文件的sed -i
选项不是POSIX支持的选项。
但是如果你想使用它:
sed -i "s|read -e -p \'Enter path for Boot Partition : \' BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g" oldfile
您可能会发现使用sed
的模式更容易,该模式与此字符串的一部分匹配,然后将其全部替换为:
sed 's|read -e -p .* BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g' filename > newfilename
来自sed
的POSIX规范页面:
s/BRE/replacement/flags
将替换字符串替换为模式空间中BRE的实例。可以使用<backslash>
或<newline>
以外的任何字符代替斜杠来分隔BRE和替换。
答案 1 :(得分:1)
您需要使用实际的替换命令,并且需要避免替换文本中的斜杠混淆function my_f() {
// code here.
}
。就个人而言,我可能会使用:
sed
甚至更可能:
sed -i.bak "s%^read .* BOOTUSERFILEPATH$%BOOTUSERFILEPATH=../board-support/prebuilt-images%" file_to_search.sh
BOOTUSERFILEPATH="../board-support/prebuild-images"
sed -i.bak "s%^read .* BOOTUSERFILEPATH$%BOOTUSERFILEPATH=$BOOTUSERFILEPATH%" file_to_search.sh
使用s%%%
代替%
来分隔命令的各个部分。我在匹配模式上作弊,假设你在文件中没有很多相似的行。