shell脚本sed命令如何使用变量替换掉包含指定字符串的整行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本sed命令如何使用变量替换掉包含指定字符串的整行相关的知识,希望对你有一定的参考价值。
有这么一个文本:
bf9c57a69985163a97249f613214f0b5 zsoelim
341be106bfb4a34f08a3431c3182e507 zip
553c4862a08bbcd33b710b24094d817f zenity
02d45afe153d3b06a186672c0bf96b3c xzless
假如我的脚本中有一个变量:
zip="c9844e7242d7f0f46d6d7725318a7088 zipcloak"
我如何使用sed命令达到<用zip变量的值替换掉上面文本含有zip这三个字符的行>
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命令如何使用变量替换掉包含指定字符串的整行的主要内容,如果未能解决你的问题,请参考以下文章