如何形成包含转义字符的 sed 表达式

如何形成包含转义字符的 sed 表达式

给定一个 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,zshbash)的 shell,您可以这样写:

sed $'i\\\n\\\tline1\\\nline2'

1 在 POSIX 兼容的 s 中,前导空格之前不需要反斜杠sed,但是某些实现(例如 BSD 上的实现)仍会去除那些前导空格而不带反斜杠

答案3

我本来打算建议:

 echo match | sed -e 's/match/\tline1\n\tline2\n&/'

相关内容