如果为空,则Sed N命令似乎删除行

时间:2014-12-24 17:20:24

标签: sed

此代码删除换行符,然后引用并分隔字符。

分号不起作用。管道到第二个sed确实有效,但分号没有。

脚本

# Piping works
echo "$1" | sed -r ':a;N;s/\n/\\n/;$!ba' | sed -r 's/(\\?.)/'"'\1',/g"
# Semicolon doesn't work on single lines
echo "$1" | sed -r ':a;N;s/\n/\\n/;$!ba;s/(\\?.)/'"'\1',/g"
# Skipping N command on single line works
echo "$1" | sed -r ':a;$bb;N;s/\n/\\n/;$!ba;:b;s/(\\?.)/'"'\1',/g"

输出:

$ wchar "test\n"
't','e','s','t','\n',
test\n
't','e','s','t','\n',
$ wchar "test
test"
't','e','s','t','\n','t','e','s','t',
't','e','s','t','\n','t','e','s','t',
't','e','s','t','\n','t','e','s','t',

1 个答案:

答案 0 :(得分:1)

您遇到的问题是第一行也是最后一行(注意"test\n"不包含换行符而是反斜杠),因此在任何测试之前执行第一个N命令当前行是否是最后一行并最终尝试获取结束。

由于您所有尝试使用标签并且N循环是将文件组装到保持缓冲区(替换新行可以等到之后),我建议以下替换:

echo -e "test\n" | sed -rn '1h;1!H;${x;s/\n/\\n/g; s/(\\?.)/'\''\1'\'', /g;p}'

这遵循基本模式

sed -n '1 h; 1! H; $ { x; do stuff; p }'

...换句话说,它将文件读入保持缓冲区,在处理最后一行时将其交换回模式空间(即,当整个文件位于保持缓冲区时),执行它然后打印结果。代替s的{​​{1}}命令将从您的代码中解除。