Если вы хотите перейти от:
\001abc \002jkl \003xyz
... к...
\001abc
\002jkl
\003xyz
... то самое простое и эффективное решение - сделать:
tr \ \\n <in >out
Это, однако, не то же самое, что разделить ваш ввод на \n
ewlines в соответствии с вашим \[0-9][0-9][0-9][0-9]
шаблоном, что можно сделать так:
sed 's/\\[0-9]\{3\}/&\n/g' <in >out
... и получить...
\001
abc \002
jkl \003
xyz
... хотя я полагаю, что вы можете иметь в виду, что хотите вставить \n
ewline перед каждым вхождением \[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
Приведенная выше цепочка команд tr
ansliterate all backslashes in input to \n
ewline characters then pipe the results to sed
which will recursively t
est the head of each input line for three digits. tr
не будет иметь никаких проблем с длинными входными строками, и к тому времени, когда он закончит работу, его вывод должен содержать по крайней мере столько \n
ewline символов, сколько вам нужно. Если символ \n
ewline не сразу после трех цифр, то он просто заменяется обратной косой чертой, если же is, то между символом \n
ewline и тремя цифрами вставляется обратная косая черта.
Результаты для второго примера:
CHANGE^
\039^OE@ MORE^
\040^L^[[00m^OAC DEPOSIT TO WHICH ACCOUNT^N020^^
\055^L^[(1^[[00m^OAA PAYMENT FROM WHICH ACCOUNT^N020