Если данные поступают на одной линии, нагруженный обратной косой черты, то я думаю, что вы можете сделать sed
работу с небольшим количеством заботы.
- Необходимо заменить каждую последовательность
\,
на новую строку.
- Вам необходимо заменить каждый
\n
, за которым следует ноль или более пробелов ни с чем.
- Вам необходимо заменить оставшуюся обратную косую черту ничем.
- Вам необходимо удалить последнюю новую строку (так что у вас их нет).
Это приводит к:
echo '\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n' |
sed -e 's/\\,/\n/g' \
-e 's/\\n *//g' \
-e 's/\\//g' \
-e 's/\n$//'
Это работает правильно для меня, когда я использую GNU sed
. Он не производит «правильный» вывод с BSD (Mac OS X) sed
; Я не получаю новые строки, вставленные в вывод. Это происходит потому, что BSD sed
придерживается спецификации POSIX sed
, в котором говорится:
Последовательность побег «\n
» должен соответствовать <newline>
внедренный в шаблоне пространства. Литерал <newline>
не должен использоваться в BRE контекстного адреса или в заменяющей функции.
И страница человек для sed
на Mac OS X, говорит то же самое:
Последовательность побег \n
совпадает с символом новой строки, встроенный в шаблон пространства. Однако вы не можете использовать буквенный символ новой строки в адресе или в команде substitute.
Как вы можете обойти это? Скорее всего, это, наверное, ответ. Команда y
может использоваться, потому что POSIX говорит:
[2addr] y/string1/string2/
Заменить все вхождения символов в string1 с соответствующими символами в string2. Если a <backslash>
, за которым следует 'n'
, появляются [sic] в string1 или string2, два символа должны обрабатываться как один <newline>
. Если количество символов в string1 и string2 не равно или если какие-либо символы в string1 появляются более одного раза, результаты не определены.Любой символ, кроме <backslash>
или <newline>
может быть использован вместо <slash>
для разделения строк. Если разделитель не является «n», то в пределах string1 и string2 сам разделитель может использоваться как буквенный символ, если ему предшествует <backslash>
. Если <backslash>
персонаж сразу же следует <backslash>
характера в string1 или строке2, два <backslash>
символы должны учитываться как единый буквального <backslash>
характер. Значение <backslash>
, за которым следует любой символ, который не является «n», <backslash>
, или символ разделителя не определен.
Рабочая страница Mac OS X менее подробна и менее педантична, но говорит о многом. Итак, я думаю, что трюк состоит в том, чтобы нанести \,
на символ, такой как Control-A, а затем использовать y/^A/\n/
, чтобы нанести на карту Control-A на новую строку.
То есть:
echo '\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n' |
sed -e 's/\\,/^A/g' \
-e 'y/^A/\n/' \
-e 's/\\n *//g' \
-e 's/\\//g' \
-e 's/\n$//'
(где то, что показано, как ^A
фактически Control-A, мне нужно использовать Control-VControl-A в vim
, чтобы вошел персонаж .) В любом случае, это нормально работает с Mac OS X или BSD sed
.
ли формат ввода одной строки нагруженный обратной косой черты и других специальных символов? Если нет, как это выглядит? Какие инструменты вы собираетесь использовать ('sed',' awk', 'perl',' python', что-то еще)? Что вы пробовали? Что дало вам проблему? –
я имею в виду использование AWK ..actually SED не работает в моем сценарии оболочки, когда я пытаюсь удалить \ п или \ – Arpan
в противном случае не для: - ABC: abc_2, рик: rick_1, ГАРРИ: harry_1, Кристина: Christine_2 , я мог бы использовать AWK «BEGIN {RS =„“;} {печать $ 1}» ..which работает для меня Этот вход будет в текстовый файл, который я использую в моем сценарии оболочки .. а потом я нужно отформатировать его до указанного вывода – Arpan