Мне нужны многострочные строки в 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 основывается на строках, поэтому следует заменить '\' и символ новой строки, который следует за ним (эффективно соединяя две строки) не очень естественно в сед.Я адаптировал sredden79 oneliner к следующему - он работает, это умно, но не ясно:
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)?