Мне нужны многострочные строки в 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 к следующему - работает, умно, но непонятно:
sed ':a { $!N; s/\\\n/\\n/; ta }'
Заменить escaped literal backslash, newline на escaped literal backslash, n. :a - это метка, а ta - метка перехода, если замена нашла совпадение; $ означает последнюю строку, а $! - противоположную (т.е. все строки, кроме последней). 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)?
+, поэтому просто закройте строку, написание+и открытие его в следующей строке устраняет необходимость в препроцессоре и сохраняет поддержку вашего инструмента. FWIW. - person T.J. Crowder   schedule 09.02.2010