У меня есть следующие строки, сохраненные в текстовом файле tel2:
Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava|926/448/829
Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava|926.443.602
Мое намерение состоит в том, чтобы поместить номер телефона как запуск каждой строки, таким образом, я сделал:
sed 's/\(.*13...|[^|]*\)\(.*\)$/\2\1/' tel2.txt
Я получил только первую группу как вывод, игнорируя вторую полученную группу. Но если я поместил \n между \2 и \1, он производит вторую группу сначала и первое в новой строке, таким образом, это не regex. Первая группа перезаписывает второе?, я пропускаю что-то?
Заранее спасибо!
На основе комментариев проблема - то, что Ваш файл имеет окончания строки DOS-style CRLF, и Ваша вторая группа получения получает CR и перемещает его в середину выходного шаблона, поскольку Вы видите использование cat -et
для создания окончаний строки явными:
$ sed 's/\(.*13...|[^|]*\)\(.*\)$/\2\1/' tel2.txt | cat -et
|926/448/829^MHernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava$
|926.443.602^MGomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava$
возможное решение А состояло бы в том, чтобы исключить CR из второй группы:
$ sed 's/\(.*13...|[^|]*\)\(.*\)\r$/\2\1\r/' tel2.txt | cat -et
|926/448/829Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$
|926.443.602Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$
(если Вы не хотите окончания стиля DOS в результате, опустите \r
в замене).
я подозреваю, что Вы действительно не хотите разделитель в передней стороне - более простое выражение, которое обрабатывает разделители, более разумно был бы
sed 's/\(.*\)|\([^|]*\)\r/\2|\1\r/'
напр.:
$ sed 's/\(.*\)|\([^|]*\)\r/\2|\1\r/' tel2.txt | cat -et
926/448/829|Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$
926.443.602|Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$