Какой самый простой способ заменить обратную косую черту \ на \ n? - PullRequest
2 голосов
/ 09 февраля 2010

Мне нужны многострочные строки в 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)?

Ответы [ 4 ]

5 голосов
/ 09 февраля 2010

Есть ли более простой, разумный и ясный способ.

Забудьте препроцессор, смирись с ограничением, пожаловайтесь на него (чтобы оно могло быть исправлено в Java 7 или 8), и используйте IDE для облегчения боли .

Другие альтернативы (я полагаю, слишком хлопотно, но все же лучше, чем возиться с процессом компиляции):

  • использовать язык на основе JVM, который поддерживает здесь-документы
  • выводит строку в файл ресурсов
3 голосов
/ 09 февраля 2010

Перл однострочный:

perl -0777 -pe 's/\\\n/\\n/g'

Это будет читать либо стандартный ввод, либо файл (ы), названный в честь него, в командной строке и записывать вывод в стандартный вывод.

Если вы используете редактор, который поддерживает фильтрацию, например, vi или emacs, просто отфильтруйте текст с помощью приведенной выше команды, и все готово:

Если вы используете Windows и вам нужно беспокоиться о \r:

C:\> perl -0777 -pe "s/\\\r?\n/\\n/g"

хотя я думаю, что win32 Perl обрабатывает \r сам, так что это может быть ненужным.

Опция -0777 - это особый случай опции -0 (это ноль), которая определяет разделитель строк или записей. В этом случае это означает, что нам не нужен какой-либо разделитель, поэтому читайте весь файл как одну строку.

Опция -pe представляет собой комбинацию -p (построчно обрабатывать и выводить результат) и -e (следующий аргумент (строка) программы для выполнения)

1 голос
/ 09 февраля 2010

Perl-скрипт к тому, что вы просили.

while (<>) {
    chomp;
    print $_;
    if (/\\$/) {
        print "n";
    } else {
        print "\n";
    }
}
0 голосов
/ 29 декабря 2014
sed 's/\x5c\x5c$/\x22\x5c\x5cn\x22/'

Hex для обратной косой черты и двойной кавычки - это \ x5c и \ x22 соответственно - его необходимо экранировать, чтобы \ x5c удваивался, а $ привязывался к концу строки.

Обновлен снова за комментарий OP:

sed "{:a;N;\$!b a};s/\x5c\x5c\n/\x5c\x5cn/g" 

: a создает метку, а N добавляет строку к пространству шаблона, a b a возвращается к метке: a, за исключением случаев, когда последняя строка $ !;

После того, как все загружено - подстановка в одну строку заменяет все вхождения новой строки \ n на литерал '\ n', используя шестнадцатеричный код ascii \ x5c для обратной косой черты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...