将变量传递给sed命令

4
我正在尝试在脚本中运行以下命令。它基本上是在定义变量的TXT之后附加TXT_NEW。将脚本包装在一个小的bash脚本中运行会出现错误:
sed: -e expression #1, char 1: unknown command: `''
#!/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

希望有人可以看一下并提供一些指导...


1
尝试在双引号内删除单引号...还有一个打字错误,应该是"$file_name"而不是$file - Sundeep
2
可能是如何在sed中使用变量的重复问题。 - shellter
1个回答

2

首先,您遇到了双引号的问题。在外部双引号内部的单引号使得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 提供文本。
为了实现更好的通用性,您还应该处理 "search string" 变量 $TXT 中的 sed 正则表达式元字符,通过转义 \/& 来实现。也许可以通过一个辅助函数 escape() 来实现:
escape() {
    sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$1";
}
sed -i "/$(escape "$TXT")/r /dev/stdin" $file_name <<<"$TXT_NEW"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接