sed - 如何使用 sed 将字符串替换为变量字符串?
问题描述
我正在尝试以下命令
new_line=My name is Eric Johnson
sed -i '/# My name is Eric/c\'"${new_line}" /tmp/foo"
Bash 在 sed 命令中将上面的 new_line 视为一个文件,并说没有这样的文件。在 sed 命令中使用变量将整行替换为新行的正确方法是什么。
解决方案
sed
不幸的是,这是标准化程度不高的角落之一。某些变体绝对需要用反斜杠转义换行符;其他人会将转义的换行符视为应在处理之前删除的内容。
作为一般经验法则,在sed
脚本周围使用单引号,以防止 shell 在sed
启动之前也修改参数。 但是,这意味着$new_line
不会对 的值进行插值。一个常见的解决方法是我所说的“跷跷板式报价”;将大部分脚本放在单引号中,但在需要 shell 插入变量的地方切换到双引号。
sed -i 's/# My name is Eric Johnson/c\'"${new_line}/" file
请注意如何"foo"'bar' = "foobar" = 'foobar' = foobar
(只要字符串不包含任何 shell 元字符,即使不带引号的标记也可以,尽管通常不建议这样做)。
另外,
new_line=My name is Eric Johnson
对于这种情况是不正确的;它将分配new_line=My
然后运行name is Eric Johnson
带有此变量分配的命令行。当命令完成时(或者,在我的计算机上,shell 报告name: command not found
的值new_line
恢复到以前的状态(如果未定义,则未定义,或者恢复到以前的值)。
推荐阅读
- java - JDBI Postgis JTS 包装器
- javascript - 选择 HTML 中的 Onchange,不起作用(Django)
- oracle - Oracle 流水线函数:ORA-06502 数值或值错误
- informatica - IICS 任务流 - 通知任务 - 附加文件
- amazon-web-services - 电子邮件未接收 Amazon SES 和 SNS
- google-chrome-extension - 使用 Chrome 扩展 chrome.storage.local 的无限存储空间?
- android - Main Activity 加载时无法启动
- reactjs - 将 React 与 Web 组件一起使用时缺少样式
- javascript - 我们如何将新的输入值放入另一个元素中?
- build - 如何在 Azure Dev Ops 中查看我的构建项目文件夹的内容?