sed 在插入内容时吞下空格

sed swallows whitespaces while inserting content

我试图在与 sed 的第一个匹配项之前插入一个新行。我想插入的内容以空格开头,但 sedbash 吞下了空格。

hello.txt

line 1
line 2
line 3

在我的案例中插入的内容来自这样的变量:

content="   hello"

我创建的命令:

sed -i "/line 2/i $content" hello.txt

结果:

line 1
hello
line 2
line 3

预期结果:

line 1
   hello
line 2
line 3

似乎 bash 吞下了空格。我试图以这种方式在变量周围使用引号:sed -i "/line 2/i \"$content\"" 但不幸的是它不起作用。玩了 2 小时后,我决定寻求帮助。

这就是 GNU sed 的工作方式,是的 - 命令 i 和文本开头之间的任何空格都会被吃掉。您可以添加一个反斜杠(至少,在 GNU sed 中;还没有测试其他人)以保留空格:

$ sed "/line 2/i \$content" hello.txt
line 1
   hello
line 2
line 3

POSIX sed i 总是在 i 之后需要一个反斜杠,然后在下一行插入一个带有文本的换行符(要插入多行,反斜杠位于除了最后一个以外的所有版本),而不是作为 GNU 扩展的 one-line 版本。

sed "/line 2/i\
$content
" hello.txt

我没有方便测试的 non-GNU 版本,所以我不知道变量中的前导空格是否会被吃掉,但我怀疑不会。

您需要改用反斜杠:

content="\    hello"

否则,它被视为/ihello之间分隔的一部分。

另请注意,$content 变量最终可能包含 sed 会以不同方式解释的各种字符...所以要小心。

在这里工作得很好:

ed hello.txt <<END_ED
/line 2/i
$content
.
wq
END_ED