【发布时间】:2011-01-14 16:31:39
【问题描述】:
我想要java中的多行字符串,所以我寻求一个简单的预处理器来将C风格的多行转换为带有文字'\n'的单行。
之前:
System.out.println("convert trailing backslashes\
this is on another line\
\
\
above are two blank lines\
But don't convert non-trailing backslashes, like: \"\t\" and \'\\\'");
之后:
System.out.println("convert trailing backslashes\nthis is on another line\n\n\nabove are two blank lines\nBut don't convert non-trailing backslashes, like: \"\t\" and \'\\\'");
我认为sed 会做得很好,但是 sed 是基于行的,因此在 sed 中替换 '\' 和它后面的换行符(有效地连接两行)不是很自然。我将sredden79's oneliner 改编为以下内容 - 它有效,很聪明,但不清楚:
sed ':a { $!N; s/\\\n/\\n/; ta }'
替换为escaped literal backslash、newline 和escaped literal backslash、n。 :a 是一个标签,ta 是 goto 标签,如果替代品找到匹配项; $ 表示最后一行,$! 则相反(即除最后一行之外的所有行)。 N 表示将下一行附加到模式空间(从而使\n 字符可见。)
编辑这里是保持编译器错误行号等准确的变体:它将每个扩展行转换为"..."+\n(并正确处理字符串的第一行和最后一行):
sed ':a { $!N; s/\\\n/\\n"+\n"/; ta }'
给予:
System.out.println("convert trailing backslashes\n"+
"this is on another line\n"+
"\n"+
"\n"+
"above are two blank lines\n"+
"But don't convert non-trailing backslashes, like: \"\t\" and \'\\\'");
编辑 实际上,最好有 Perl/Python 风格的多行代码,其中它以一行上的特殊代码开始和结束(我认为是 python 的“”)。
有没有更简单、更理智、更清晰的方法(可能不使用 sed)?
【问题讨论】:
-
如果你这样做,你会扼杀你的工具支持。突然没有 IDE 会正确地进行语法高亮,调试器将显示与您的(原始)源文件不同的行号......请记住,编译器(在编译时)会将与
+连接的文字字符串连接在一起,所以只需关闭字符串,写一个+,然后在下一行打开它会去掉预处理器并保持你的工具支持完好无损。 FWIW。