Как вставить символ новой строки после запятой в `), (` с помощью sed? - PullRequest
7 голосов
/ 28 февраля 2012

Как вставить символ новой строки после запятой в ),( с помощью sed?

$ more temp.txt
(foo),(bar)
(foobar),(foofoobar)

$ sed 's/),(/),\n(/g' temp.txt 
(foo),n(bar)
(foobar),n(foofoobar)

Почему это не работает?

Ответы [ 4 ]

7 голосов
/ 28 февраля 2012

sed не поддерживает escape-последовательность \n в своей команде подстановки, однако она поддерживает реальный символ новой строки, если вы экранируете его (поскольку команды sed должны использовать только одну строку, а escape -здесь, чтобы сообщить sed, что вы действительно хотите использовать символ новой строки):

$ sed 's/),(/),\\
(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)

Вы также можете использовать переменную оболочки для хранения символа новой строки.

$ NL='
'
$ sed "s/),(/,\\$NL(/g" temp.txt
(foo),
(bar)
(foobar),
(foofoobar)

Протестировано в Mac OSX Лев, используя bash в качестве раковины.

3 голосов
/ 28 февраля 2012

Вам просто нужно выйти с символом обратной косой черты и нажать клавишу ввода при наборе:

$ sed 's/),(/),\
(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)
2 голосов
/ 07 февраля 2019

ОК, я знаю, что этот вопрос старый, но мне нужно было пройти через него, чтобы sed принял символ \ n. Я нашел решение, которое работает в bash, и я отмечаю его здесь для тех, кто сталкивается с той же проблемой.

Чтобы переформулировать проблему: заставьте sed принять новую строку с обратной косой чертой (или другие символы с обратной косой чертой).

Обходной путь в bash - использовать:

$'\n'

В bash строка $ '\ n' заменяется реальной новой строкой.

Единственное, что вам нужно сделать, это дважды убежать от \ n, поскольку вы должны убежать от самого слеша.

Чтобы сложить все вместе:

sed $'s/),(/),\\\n(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)

Если вы хотите, чтобы оно действительно изменилось, а не распечатывалось, используйте -i

sed -i $'s/),(/),\\\n(/g' temp.txt
2 голосов
/ 14 июня 2018

Это работает для меня:

$ echo "(foo),(bar)" | sed s/')','('/')',\\n'('/g
(foo),
(bar)

Я использую:

  • GNU sed 4.2.2
  • GNU bash, версия 4.3.48 (1) -релиз (x86_64-pc-linux-gnu)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...