此代码删除换行符,然后引用并分隔字符。
分号不起作用。管道到第二个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',
答案 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}}命令将从您的代码中解除。