bash - sed 用多行替换变量

标签 bash variables sed

<分区>

我正在尝试用跨越多行的文本替换一个词。我知道我可以简单地使用换行符\n 来解决这个问题,但我想保持字符串“干净”的任何不需要的格式。

下面的例子显然行不通:

read -r -d '' TEST <<EOI
a
b
c
EOI

sed -e "s/TOREPLACE/${TEST}/" file.txt

关于如何在不修改以 read 开始并以 EOI 结束的部分的情况下实现这一目标的任何想法?

最佳答案

鉴于您使用的是 Bash,您可以使用它来替换 \n 换行符:

sed -e "s/TOREPLACE/${TEST//$'\n'/\\n}/" file.txt

为了适本地健壮,您还需要转义 /&\:

TEST="${TEST//\\/\\\\}"
TEST="${TEST//\//\\/}"
TEST="${TEST//&/\\&}"
TEST="${TEST//$'\n'/\\n}"
sed -e "s/TOREPLACE/$TEST/" file.txt

如果您的匹配是整行并且您使用的是 GNU sed,那么使用它的 r 命令可能会更容易:

sed -e $'/TOREPLACE/{;z;r/dev/stdin\n}' file.txt <<<"$TEST"

关于bash - sed 用多行替换变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6684487/

相关文章:

bash - Mac - 无法安装 HomeBrew,因为缺少 Curl

bash - 如何在 GNU 排序中使用 NULL (\0) 作为分隔符

linux - 尝试我的第一个 BASH 脚本,总是遇到意外的文件结尾

php - PHP中的未定义索引_非复合名称

mysql - 在 MySql 中创建触发器时声明变量

linux - sed 提取给定日期之间的日志

regex - 执行正则表达式捕获,然后使用SED/PERL进行替换

Bash:用字符串替换空行

regex - 在 TSV 的匹配之前/之后插入换行符

python - 使用 Sed 向 Chef .json 文件添加新角色