给定一个 sed 表达式(以及 ArchLinux 上的 GNU sed 4.2.2)
/match/i\tline1\n\tline2
它应该在匹配项上方插入两个制表符缩进行,我发现第一个字符的转义(在示例中为\t
)被忽略,但所有其他转义字符都被正确处理。
像这样测试:
echo match | sed -e '/match/i\tline1\n\tline2'
结果是
tline1
line2
match
无论初始转义字符是什么(例如制表符或换行符),结果都是相同的。构造表达式以便正确处理第一个字符的正确方法是什么?
答案1
检查 gnu sed 手册(http://www.gnu.org/software/sed/manual/html_node/Other-Commands.html#Other-Commands) --i
命令实际上就是i\
命令,所以你只需要一个额外的反斜杠
echo match | sed -e '/match/i\\tline1\n\tline2'
# ---------------------------^
答案2
标准语法(如果您想移植到非 GNU 系统)是:
sed 'i\
\ line1\
line2'
也就是说,您需要在 后换行i\
,并且无法识别转义序列(制表符上方是按字面输入的)。只是,您需要使用反斜杠转义换行符、反斜杠字符和前导空格。
对于支持(非标准sh
)ksh$'...'
类型的引号(如ksh93
,zsh
或bash
)的 shell,您可以这样写:
sed $'i\\\n\\\tline1\\\nline2'
1 在 POSIX 兼容的 s 中,前导空格之前不需要反斜杠sed
,但是某些实现(例如 BSD 上的实现)仍会去除那些前导空格而不带反斜杠。
答案3
我本来打算建议:
echo match | sed -e 's/match/\tline1\n\tline2\n&/'