繁体   English   中英

将变量传递给sed命令

[英]passing variables to sed command

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

sed:-e表达式#1,char 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

感谢有人可以看看并提供一些指示......

首先,你有双重引用的问题。 外双引号内的单引号正在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 append命令,您可以考虑使用append from file命令 r <filename> ,如下所示:

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

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

你应该做它推广的另一件事是处理sed在“搜索字符串”可变正则表达式元字符$TXT ,通过转义\\/& 也许通过辅助函数escape()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM