如何在sed中使用变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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 定义一个标签,名称为a
n;
读取下一行
/$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 定义一个标签,名称为a
n;
读取下一行
/$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:\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 文件),我可以使用符号组合吗?像@@ 或 ::

以上是关于如何在sed中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sed 的命令中使用变量?

如何在 sed 命令中使用变量来替换属性文件中的属性值

如何使用sed在文件中确定行插入带有变量的字符串

SHELL中SED如何获取变量的值???

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

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