用\n替换尾部反斜杠\的最清楚的方法是什么?

13r*_*ren 2 perl awk sed

我想在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 \'\\\'");
Run Code Online (Sandbox Code Playgroud)

后:

     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 \'\\\'");
Run Code Online (Sandbox Code Playgroud)

我认为sed会做得很好,但是sed是基于行的,所以替换'\'和它后面的换行符(有效加入两行)在sed中并不是很自然.我将sredden79的oneliner改编为以下 - 它有效,它很聪明,但不清楚:

sed ':a { $!N; s/\\\n/\\n/; ta }'
Run Code Online (Sandbox Code Playgroud)

替补是escaped literal backslash,newlineescaped literal backslash,n. :a是标签,ta如果替代品找到匹配,则为goto标签; $表示最后一行,并且$!是相反的(即所有行,但最后一行). N意味着将下一行附加到模式空间(从而使\n角色可见.)

编辑这里是一个变量,以保持编译器错误行号等准确:它将每个扩展行转换为"..."+\n(并正确处理字符串的第一行和最后一行):

sed ':a { $!N; s/\\\n/\\n"+\n"/; ta }'
Run Code Online (Sandbox Code Playgroud)

赠送:

    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 \'\\\'");
Run Code Online (Sandbox Code Playgroud)

编辑实际上,最好是使用Perl/Python风格的多行,它在一行上以特殊代码开头和结尾(对于python,我认为是"").

是否有更简单,更安全,更清晰的方式(可能不使用sed)?

Thi*_*ilo 5

是否有更简单,更安全,更清晰的方式.

忘记预处理器,忍受限制,抱怨它(这样它可能会在Java 7或8中修复),并使用IDE来缓解痛苦.

其他替代方案(我认为太麻烦了,但仍然比编译过程更糟糕):

  • 使用支持here-docs的基于JVM的语言
  • 将字符串外部化为资源文件