sed 在插入内容时吞下空格
sed swallows whitespaces while inserting content
我试图在与 sed
的第一个匹配项之前插入一个新行。我想插入的内容以空格开头,但 sed
或 bash
吞下了空格。
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"
否则,它被视为/i
和hello
之间分隔的一部分。
另请注意,$content
变量最终可能包含 sed
会以不同方式解释的各种字符...所以要小心。
ed 在这里工作得很好:
ed hello.txt <<END_ED
/line 2/i
$content
.
wq
END_ED
我试图在与 sed
的第一个匹配项之前插入一个新行。我想插入的内容以空格开头,但 sed
或 bash
吞下了空格。
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"
否则,它被视为/i
和hello
之间分隔的一部分。
另请注意,$content
变量最终可能包含 sed
会以不同方式解释的各种字符...所以要小心。
ed 在这里工作得很好:
ed hello.txt <<END_ED
/line 2/i
$content
.
wq
END_ED