я искал замену "." период, и это было решением, которое я ищу :)
Иона
1
Это не работает в оболочке bash $ tr, '\ n' использование aitr: tr [-Ccsu] строка1 строка2 tr [-Ccu] -d строка1 tr [-Ccu] -s строка1 tr [-Ccu] -ds строка1 строка2
Учащийся
5
Замена запятой точкой с запятой также работает:tr ',' ';' < input.csv > output.csv
Вам нужен буквальный перевод строки с обратной косой чертой, чтобы попасть в sed. По крайней мере, в bash $''строки будут заменены \nреальным символом новой строки, но тогда вам придется удвоить обратную косую черту, которую увидит sed, чтобы избежать перехода на новую строку, например
Спасибо за это - Интересно, почему мой старый трюк с Linux не работал в OSX. Но это так!
Wyatt8740
6
Это единственное решение, которое работает в сценарии sed.
Firstrock
6
Обратите внимание, что обратный слеш экранирует буквальный символ новой строки (так что это не терминатор команды): это не символ продолжения строки (как в bash и т. Д.). Чтобы увидеть разницу, попробуйте написать вышеупомянутую команду без кавычек: вместо этого обратная косая черта будет интерпретироваться оболочкой как символ продолжения строки, и она и символ новой строки будут отброшены. И наоборот, включите содержимое выражения в кавычках (без кавычек) в отдельный файл запятой-newline.sed (что исключает синтаксис оболочки), и это работает!
Нильс фон Барт
1
это хорошо, поскольку он может заменить что угодно, а не персонажа. Кажется, tr работает только с персонажами. если вы поместите строку в качестве первого параметра, она заменит все вхождения символов, а не строку.
Шон
1
@Droogans Вы используете bash, sh или другую оболочку? Вы уверены, что используете одинарные кавычки вместо двойных?
Макс Нанаси
22
Если ваше использование sed имеет тенденцию быть полностью выражениями подстановки (как и мое), вы также можете использовать perl -peвместо
$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
Это работает на MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) и RHE Linux (Red Hat Enterprise Linux Server версии 5.3, Tikanga) ...
$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt
... где ^Jэто делается, делая ctrl+ v+ j. Имейте в виду, \прежде чем ^J.
PS Я знаю, что sed в RHEL - это GNU, sed для MacOS - на основе FreeBSD, и хотя я не уверен насчет sed на Solaris, я считаю, что он будет работать практически с любым sed. YMMV tho '...
Это также подходит для конкурса «Запутанный С», за исключением того, что это Bash;)
Аарон Р.
@AaronR. Я согласен :-). Конечно, я предпочитаю trрешение, которое уже является принятым ответом.
ryenus
1
Это работало на OS X. Почему это \n\rвместо \r\n? Я попытался, \r\nкоторый является необходимым порядком в Windows. Однако после того, как я это сделаю, в нем останется много ^Mсимволов возврата каретки vim, поэтому я думаю, что это должно быть только, \nно \nодиночество не работает.
NobleUplift
4
Хотя я опаздываю на этот пост, просто обновляю свои выводы. Этот ответ только для Mac OS X.
В приведенной выше команде я попытался с помощью Shift + Enter добавить новую строку, которая не работала. Так что на этот раз я попытался "убежать" от "неэкранированного символа новой строки", как было сказано в ошибке.
Это ничем не отличается от ответа Макса Нанаси за два года до твоего.
miken32
2
Просто чтобы прояснить: man-страница sed в OSX (10.8; Darwin Kernel Version 12.4.0) говорит:
[...]
Sed Регулярные выражения
The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
(modern) regular expressions can be used instead if the -E flag is given. In addition, sed has the following two additions to regular
expressions:
1. In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
Also, putting a backslash character before the delimiting character causes the character to be treated literally. For example, in the
context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
``abcxdef''.
2. The escape sequence \n matches a newline character embedded in the pattern space. You cannot, however, use a literal newline charac-
ter in an address or in the substitute command.
[...]
так что я думаю, что нужно использовать tr - как упомянуто выше - или отличный
sed "s/,/^M
/g"
примечание: вам нужно набрать < ctrl> -v, < return>, чтобы получить '^ M' в редакторе vi
sedна MacOS Mojave был выпущен в 2005 году, поэтому одним из решений является установка gnu-sed,
brew install gnu-sed
тогда использование gsedбудет делать, как вы хотите,
gsed 's/,/\n/g' file
Если вы предпочитаете sed , просто sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', что предлагается brew info gnu-sed. Перезапустите ваш термин, затем ваш sedв командной строке gsed.
FWIW, следующая строка работает в окнах и заменяет точки с запятой в моих переменных пути новой строкой. Я использую инструменты, установленные в моей директории git bin.
tr , '\n'
. Я полагаю, что sed относится\n
к простому тексту.tr , '\n' < file
- нет трубы.g
конец сценария? Я получаю такое же поведение без него.Ответы:
Используйте
tr
вместо этого:источник
tr ',' ';' < input.csv > output.csv
Используйте строку в кавычках ANSI-C
$'string'
Вам нужен буквальный перевод строки с обратной косой чертой, чтобы попасть в sed. По крайней мере, в bash
$''
строки будут заменены\n
реальным символом новой строки, но тогда вам придется удвоить обратную косую черту, которую увидит sed, чтобы избежать перехода на новую строку, напримерОбратите внимание, что это не будет работать на всех оболочках , но будет работать на самых распространенных.
источник
echo "a,b" | sed -e $'s/,/\\n/g
.man bash
.sed -E $'s/<\\/br>/\\\n/g' file
нет необходимости устанавливать gnu-sed-e
Часть , кажется , не нужно.работает на Mac OS X.
источник
Если ваше использование sed имеет тенденцию быть полностью выражениями подстановки (как и мое), вы также можете использовать
perl -pe
вместоисточник
Видимо
\r
это ключ!Преобразовал это:
К этому:
источник
\r
это не то же самое\n
, и это может нарушить дальнейшее манипулирование данными и их использование.\r
!Это работает на MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) и RHE Linux (Red Hat Enterprise Linux Server версии 5.3, Tikanga) ...
... где
^J
это делается, делая ctrl+ v+ j. Имейте в виду,\
прежде чем^J
.PS Я знаю, что sed в RHEL - это GNU, sed для MacOS - на основе FreeBSD, и хотя я не уверен насчет sed на Solaris, я считаю, что он будет работать практически с любым sed. YMMV tho '...
источник
MacOS отличается, есть два способа решить эту проблему с помощью Sed в Mac
во-первых, используйте
\'$'\n''
replace\n
, он может работать в MacOS:во-вторых, просто используйте пустую строку:
Ps. Обратите внимание на диапазон, разделенный
'
в-третьих, используйте gnu-sed вместо mac-sed
источник
Чтобы завершить это, это также работает:
источник
tr
решение, которое уже является принятым ответом.\n\r
вместо\r\n
? Я попытался,\r\n
который является необходимым порядком в Windows. Однако после того, как я это сделаю, в нем останется много^M
символов возврата кареткиvim
, поэтому я думаю, что это должно быть только,\n
но\n
одиночество не работает.Хотя я опаздываю на этот пост, просто обновляю свои выводы. Этот ответ только для Mac OS X.
В приведенной выше команде я попытался с помощью Shift + Enter добавить новую строку, которая не работала. Так что на этот раз я попытался "убежать" от "неэкранированного символа новой строки", как было сказано в ошибке.
Работал! (в Mac OS X 10.9.3)
источник
Просто чтобы прояснить: man-страница sed в OSX (10.8; Darwin Kernel Version 12.4.0) говорит:
[...]
Sed Регулярные выражения
[...]
так что я думаю, что нужно использовать tr - как упомянуто выше - или отличный
примечание: вам нужно набрать < ctrl> -v, < return>, чтобы получить '^ M' в редакторе vi
источник
...
У меня работает на Мохаве
источник
sed
на MacOS Mojave был выпущен в 2005 году, поэтому одним из решений является установкаgnu-sed
,тогда использование
gsed
будет делать, как вы хотите,Если вы предпочитаете
sed
, простоsudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, что предлагаетсяbrew info gnu-sed
. Перезапустите ваш термин, затем вашsed
в командной строкеgsed
.источник
FWIW, следующая строка работает в окнах и заменяет точки с запятой в моих переменных пути новой строкой. Я использую инструменты, установленные в моей директории git bin.
источник