使用SED在脚本中替换困难的字符串

时间:2015-10-07 17:20:35

标签: linux bash sed

我知道,很多人对如何使用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

更新:我修复了语法错误,但文件仍未使用新路径信息更新... :(

发现了这个问题。搜索没有找到字符串,因为我的搜索命令中有额外的空格。它现在有效!

2 个答案:

答案 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%%%代替%来分隔命令的各个部分。我在匹配模式上作弊,假设你在文件中没有很多相似的行。