2015-09-24 2 views
-1

Мне нужно отформатировать данный вход для показанного вывода. Как мне это сделать?Форматирование ввода файла на требуемый вывод с использованием сценария оболочки

Вход:

\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n 

enter image description here

+0

ли формат ввода одной строки нагруженный обратной косой черты и других специальных символов? Если нет, как это выглядит? Какие инструменты вы собираетесь использовать ('sed',' awk', 'perl',' python', что-то еще)? Что вы пробовали? Что дало вам проблему? –

+0

я имею в виду использование AWK ..actually SED не работает в моем сценарии оболочки, когда я пытаюсь удалить \ п или \ – Arpan

+0

в противном случае не для: - ABC: abc_2, рик: rick_1, ГАРРИ: harry_1, Кристина: Christine_2 , я мог бы использовать AWK «BEGIN {RS =„“;} {печать $ 1}» ..which работает для меня Этот вход будет в текстовый файл, который я использую в моем сценарии оболочки .. а потом я нужно отформатировать его до указанного вывода – Arpan

ответ

1

С GNU AWK для мульти-гольцов RS:

$ awk -v RS=',?\\\\n[[:space:]]+' 'gsub(/\\/,"")' file 
abc:abc_2 
rick:rick_1 
harry:harry_1 
Christine:Christine_2 
1

Если данные поступают на одной линии, нагруженный обратной косой черты, то я думаю, что вы можете сделать 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.

Смежные вопросы