CentOS6 - Запуск OpenVPN: сбой

Если вы хотите перейти от:

\001abc \002jkl \003xyz

... к...

\001abc
\002jkl
\003xyz

... то самое простое и эффективное решение - сделать:

tr \  \\n <in >out

Это, однако, не то же самое, что разделить ваш ввод на \newlines в соответствии с вашим \[0-9][0-9][0-9][0-9] шаблоном, что можно сделать так:

sed 's/\\[0-9]\{3\}/&\n/g' <in >out

... и получить...

\001
abc \002
jkl \003
xyz

... хотя я полагаю, что вы можете иметь в виду, что хотите вставить \newline перед каждым вхождением \[0-9][0-9][0-9], в этом случае вы можете сделать:

sed 's/\\[0-9]\{3\}/\n&/g' <in >out

... чтобы получить...


\001abc 
\002jkl
\003xyz

...с пробелом в конце каждой строки.

Но в обоих случаях могут возникнуть проблемы при работе с очень длинными входными строками. Если весь ваш входной файл состоит только из одной строки, то мы можем надежно сделать:

{   tr '\\' \\n | 
    sed -e:t \
        -e'$!N;/\n[0-9]\{3\}/!s/\n/\\/;tt' \
        -e's/\n/&\\/;P;D'
}   <infile >outfile

Приведенная выше цепочка команд transliterate all backslashes in input to \newline characters then pipe the results to sed which will recursively test the head of each input line for three digits. tr не будет иметь никаких проблем с длинными входными строками, и к тому времени, когда он закончит работу, его вывод должен содержать по крайней мере столько \newline символов, сколько вам нужно. Если символ \newline не сразу после трех цифр, то он просто заменяется обратной косой чертой, если же is, то между символом \newline и тремя цифрами вставляется обратная косая черта.

Результаты для второго примера:


CHANGE^
\039^OE@ MORE^
\040^L^[[00m^OAC DEPOSIT TO WHICH ACCOUNT^N020^^
\055^L^[(1^[[00m^OAA PAYMENT FROM WHICH ACCOUNT^N020
0
21.01.2018, 11:52
0 ответов

Теги

Похожие вопросы