2016-09-10 3 views
0

У меня есть (что я считаю сложным) sed проблема.Sed command заменить номер + письмо с номером + n + письмо

У меня есть файл, который содержит обычный текст и цифры.

Каждый экземпляр в файле, где есть ряд [0-9] следует буква, которая либо C, T или D, я хотел бы заменить его с тем же номером, за которым следует \n характер и той же буквой.

E.g.

551235D 4218789T 435151C 

Я хотел бы заменить

551235\nD 4218789\nT 435151\nC 

Проблема я столкнулся в том, как заменить каждую букву/число комбо с той же буквой/номером. Легко заменить [0-9] следуют C, T или D с, что мне нравится, проблема вставки \n между числом и буквой ...

Любая помощь будет высоко оценен.

+0

Разделяя Ваше исследование помогает всем. Сообщите нам, что вы пробовали, и почему это не соответствовало вашим потребностям. Это показывает, что вы потратили время , чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов, и, прежде всего, поможет вам получить более конкретный и релевантный ответ! Также см. [Как спросить] (http://stackoverflow.com/questions/how-to-ask) –

+0

Что-то вроде [this] (https://regex101.com/r/uE6wF1/1)? –

ответ

2

Это может работать для вас (GNU СЭД):

sed 's/\([0-9]\)\([DTC]\)/\1\n\2/g' file 

Используйте обратные ссылки.

+1

Стоит упомянуть '-i' и' -i.bak'. Кроме этого, выглядит хорошо. –

+0

@potong Почти там: D Он работает, выводя то, что мне нужно в командной строке, но когда я пытаюсь перенаправить вывод в файл следующим образом: sed 's/\ ([0-9] \) \ ([DTC] \)/\ 1 \ n \ 2/g 'file> newFile Не работает или не дает сообщений об ошибках –

0

В sed, новая строка может быть замещенными вытеканиями его с \:

A line can be split by substituting a <newline> into it. The application shall escape the <newline> in the replacement by preceding it by a <backslash>.

Кроме того, новые строки могут быть легко добавлены с помощью аргументов через множество применений -e:

The commands specified by each -e or -f option shall be added to the script in the order specified. When each addition is made, if the previous addition (if any) was from a -e option, a <newline> shall be inserted before the new addition.

В любом из вышеперечисленных может быть объединен с задней опорной заменой (\1, \2 и т.д.), чтобы разделить линии между требуемыми символами.

$ sed 's/\([0-9]\)\([DTC]\)/\1\ 
> \2/g' 

или

$ sed -e's/\([0-9]\)\([DTC]\)/\1\' -e'\2/g' 
Смежные вопросы