【问题标题】:passing variables to sed command将变量传递给 sed 命令
【发布时间】:2017-12-15 20:00:56
【问题描述】:

我正在尝试在脚本中运行以下内容。它基本上在 TXT 之后附加 TXT_NEW 和定义变量。运行包装在一个小 bash 脚本中的脚本会引发错误:

sed:-e 表达式#1,字符 1:未知命令:`''

#!/bin/bash

user="Alpine"
new_user="Volverine"
file_name=file.txt

TXT="This Text is by $user"
TXT_NEW="This is owned by $new_dev"

sed -i "'/$TXT/a ${TXT_NEW}'" $file

为了解决问题,我使用如下方式回应了 sed 命令:

echo sed -i "'/$TXT/a ${TXT_NEW}'" $file

我看到变量像这样正确扩展:

sed -i '/This Text is by Alpine/a This is owned by Volverine' file.txt

如果有人可以看看并提供一些指示......

【问题讨论】:

标签: bash sed


【解决方案1】:

首先,双引号有问题。外部双引号内的单引号使 sed 失败,因为它将第一个字符 ' 读取为无效命令。

所以,只需删除这些,您提供的示例应该可以工作:

#!/bin/bash
user="Alpine"
new_user="Volverine"
file_name="file.txt"

TXT="This Text is by $user"
TXT_NEW="This is owned by $new_user"

sed -i "/$TXT/a ${TXT_NEW}" "$file_name"

但是,由于您的问题是关于 将变量文本 传递给 sed 追加命令,您可以考虑使用 从文件追加命令r <filename>,例如这个:

sed -i "/$TXT/r /dev/stdin" $file_name <<<"$TXT_NEW"

r 命令类似于a(附加文本),但它从指定的文件中读取要附加的文本。如果我们说从/dev/stdin 读取(应该在bash 工作),我们可以通过here-string 提供文本。

您应该做的另一件事概括这是通过转义\/&amp; 来处理“搜索字符串”变量$TXT 中的sed 正则表达式元字符.也许通过辅助函数escape()

escape() {
    sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$1";
}
sed -i "/$(escape "$TXT")/r /dev/stdin" $file_name <<<"$TXT_NEW"

【讨论】: