如何在sed中使用变量 admin 2023-07-17 11:21:02 篇首语:本文由小编为大家整理,主要介绍了如何在sed中使用变量相关的知识,希望对你有一定的参考价值。 通常,我们使用sed进行变量替换的时候,替换和被替换变量都是hard-coded的。例如: sed -n "/comm/p’ /tmp/test.log 如果我们用一变量var,它的值根据上下文变化 $ var=”comm”,定义了变量,那么我们在sed的使用中这样使用变量 $ sed -n "/’”$var”"/p’ /tmp/test.log 注意,是用单引号包含双引号来引用变量。 最初接触这个命令的人,可能以为$var之前的单引号会结束当前的script,其实不会。 若要在文本中匹配一个范围的话,可以使用的sed匹配$ sed -n "/’”$var_start”"/p;:a;n;/’”$var_end”"/p;ba’ /tmp/test.log -n 关闭sed的默认输出/$var_start/ 当数据行中查找到字符串$var_start 时开始工作,后面的是命令组p; 打印出$var_start 这一行:a 定义一个标签,名称为an; 读取下一行/$var_end/p; 当读入的这一行中查找到$var_end 字符串时,输出ba 跳转到标签a 其实有个问题,应该适时跳出的,不然要等文件全部读取完,效率低了。自己改吧 参考技术A 使用sed进行变量替换的时候,替换和被替换变量都是hard-coded的。sed -n "/comm/p’ /tmp/test.log如果我们用一变量var,它的值根据上下文变化$ var=”comm”,定义了变量,那么我们在sed的使用中这样使用变量$ sed -n "/’”$var”"/p’ /tmp/test.log注意,是用单引号包含双引号来引用变量。最初接触这个命令的人,可能以为$var之前的单引号会结束当前的script,其实不会。若要在文本中匹配一个范围的话,可以使用的sed匹配$ sed -n "/’”$var_start”"/p;:a;n;/’”$var_end”"/p;ba’ /tmp/test.log-n 关闭sed的默认输出/$var_start/ 当数据行中查找到字符串$var_start 时开始工作,后面的是命令组p; 打印出$var_start 这一行:a 定义一个标签,名称为an; 读取下一行/$var_end/p; 当读入的这一行中查找到$var_end 字符串时,输出ba 跳转到标签a 如何使用 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: :\ :g;$s:\ $::"<<<"$variable")" 然后在 sed 命令中使用该变量将文本替换为变量值。 sed -i "s:SearchString:$variable2//&/\&:g"<<<"SearchString" File.htmlsed 命令抛出错误,说明 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 文件),我可以使用符号组合吗?像@@ 或 ::以上是关于如何在sed中使用变量的主要内容,如果未能解决你的问题,请参考以下文章 利用sqlmap进行post注入(实操) Linux传输指令-scp 您可能还会对下面的文章感兴趣: 相关文章 浏览器打不开网址提示“ERR_CONNECTION_TIMED_OUT”错误代码的解决方法 如何安装ocx控件 VMware的虚拟机为啥ip地址老是自动变化 vbyone和EDP区别 linux/debian到底怎么重启和关机 苹果平板键盘被弄到上方去了,如何调回正常? 机器学习常用距离度量 如何查看kindle型号