shell脚本sed命令如何使用变量替换掉包含指定字符串的整行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本sed命令如何使用变量替换掉包含指定字符串的整行相关的知识,希望对你有一定的参考价值。

有这么一个文本:
bf9c57a69985163a97249f613214f0b5 zsoelim
341be106bfb4a34f08a3431c3182e507 zip
553c4862a08bbcd33b710b24094d817f zenity
02d45afe153d3b06a186672c0bf96b3c xzless
假如我的脚本中有一个变量:
zip="c9844e7242d7f0f46d6d7725318a7088 zipcloak"
我如何使用sed命令达到<用zip变量的值替换掉上面文本含有zip这三个字符的行>

#先将包含指定字符串的整行打印到变量tmp
tmp=$(sed -n '/$zip/p' 文本名)
#然后将文本中这一整行字符串替换为你想要修改的字符串
sed -i 's/$tmp/$zip/g' 文本名
参考技术A sed "s/zip/$zip/g" file
sed双引号可以识别变量本回答被提问者采纳

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本

【中文标题】如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本【英文标题】:How to find and replace text with variable (variable holds Unix scripts) using sed or awk command 【发布时间】:2018-08-05 15:07:35 【问题描述】:

目标:我想用包含 unix 代码的文件内容替换字符串。

我想做的是:

首先:我将文件的内容存储到一个变量中

variable=`cat sample.sh`
variable2="$(sed -z 's:\n:\\\n:g;$s:\\\n$::'<<<"$variable")" 

然后在 sed 命令中使用该变量将文本替换为变量值。

sed -i "s:SearchString:$variable2//&/\\\&:g"<<<"SearchString"  File.html

sed 命令抛出错误,说明

sed: -e expression #, char 5: s' 的未知选项

请帮助实现我的目标。

【问题讨论】:

欢迎来到 Stack Overflow,请添加 3 个简单的东西,1- 在您的帖子的代码标签中添加示例输入文件。 2-使用代码标签添加所有条件的预期输出,3-您尝试过的内容。将这些添加到您的帖子中,然后让我们知道。 您无需将文件内容放入变量中,然后使用sed 访问变量。 sed 本身可以读取 Input_file。 你能详细解释一下吗,我是 unix 新手,对 shell 脚本知之甚少@RavinderSingh13 【参考方案1】:

@GulamJeelani 您使用错误的工具以错误的方式处理此问题。 sed 用于做 s/old/new,仅此而已。请参阅Is it possible to escape regex metacharacters reliably with sed,了解您在尝试强制 sed 完成这项工作或比 s/old/new 更复杂的任何事情时将面临的一些问题。只需使用 awk:

awk '
BEGIN  old = "SearchString" 
NR==FNR  new = (FNR>1 ? new ORS : "") $0; next 
s=index($0,old)  $0 = substr($0,1,s-1) new substr($0,s+length(old)) 
 print 
' sample.sh File.html

当然,上述内容未经测试,因为您没有提供我们可以测试的示例输入/输出,但应该很明显它在做什么以及如何在必要时对其进行调整。

【讨论】:

在将 sample.sh 附加到 HTML 文件之前,我正在对该 sh 文件进行一些处理,所以我将它保存到某个变量中,然后运行 ​​sed 命令,仅供参考,我有更多文件 (15-20) 并使用 awk 将使我的代码看起来更长。 @埃德莫顿 如果是这样,那么您几乎可以肯定是以错误的方式处理任务。更重要的是 - 使用 awk 可以稳健、高效、可移植地工作,并且以后增强也很简单,这一切都比你的代码是否长几行重要得多,即使是这种情况。在您接受的答案下的评论中,您说suggest me any char/symbol which will not likely to be used in shell script - 仅此一项就应该是一个巨大的危险信号,表明您的方法是错误的。 我会查看代码并尝试在我的代码中实现它,谢谢@Ed Morton 不客气,当然,如果您遇到任何问题,请随时在此网站上发布新问题。【参考方案2】:

问题可能是您在 $variable2 中有一个冒号,它终止了替换值。有没有你知道不会出现在 $variable2 中的字符?例如,“管道”字符“|” - 如果有,请在此处使用该字符而不是“:”来分隔“s”命令的各个部分。

我认为这是一个错字,但您在 sed 命令的“$variable2”中缺少左大括号。

还有其他方法可以解决您的问题,但这是最小的变化。

【讨论】:

你是对的。冒号终止了替换@simon3270,我使用插入符号(^)字符来分隔部分。您能否建议我任何不太可能在 shell 脚本中使用的字符/符号(我的输入文件是 shell 文件),我可以使用符号组合吗?像@@ 或 ::

以上是关于shell脚本sed命令如何使用变量替换掉包含指定字符串的整行的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本之sed使用----替换变量转义字符

转载:shell脚本之sed使用----替换变量转义字符

shell sed 问题

Solaris里面的sed怎样把指定字符替换成换行

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本

如何在Unix下使用sed命令