У меня есть файл id, разделенный запятой. Я пытаюсь заменить запятые новой строкой. Я пробовал:
sed 's/,/\n/g' file
но он не работает. Что мне не хватает?
У меня есть файл id, разделенный запятой. Я пытаюсь заменить запятые новой строкой. Я пробовал:
sed 's/,/\n/g' file
но он не работает. Что мне не хватает?
Вместо этого используйте tr
:
tr , '\n' < file
Используйте $'string'
Вам нужна обратная косая черта с линией, чтобы перейти к sed.
По крайней мере в bash строки $''
заменят \n
на новую строку новой строки, но тогда вам придется удвоить обратную косую черту, которую sed увидит, чтобы избежать новой строки, например.
echo "a,b" | sed -e $'s/,/\\\n/g'
sed 's/,/\
/g'
работает в Mac OS X.
Если ваше использование 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, MacOS sed - это FreeBSD, и, хотя я не уверен в отношении Solaris sed, я считаю, что это будет работать в значительной степени с любым sed. YMMV tho '...
По-видимому \r
является ключом!
$ sed 's/, /\r/g' file3.txt > file4.txt
Преобразовать это:
ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS
Для этого:
ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS
MacOS отличается, есть два способа решить эту проблему с помощью Sed в Mac
во-первых, используйте \'$'\n''
replace \n
, это может работать в MacOS:
sed 's/,/\'$'\n''/g' file
во-вторых, просто используйте пустую строку:
sed 's/,/\
/g' file
Ps. Обратите внимание на диапазон, разделенный '
Чтобы завершить работу, это также работает:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
Хотя я опаздываю на этот пост, просто обновляю свои результаты. Этот ответ предназначен только для Mac OS X.
$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern
В приведенной выше команде я попытался с помощью Shift + Enter добавить новую строку, которая не сработала. Итак, на этот раз я попытался "ускользнуть" от "unescaped newline", как сказал ошибка.
$ sed 's/new/\
> /g' m1.json > m2.json
Работает! (в Mac OS X 10.9.3)
Просто, чтобы очистить: man-страница sed на OSX (10.8; Darwin Kernel Version 12.4.0) говорит:
[...]
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, < возврат > , чтобы получить '^ M' в редакторе vi
FWIW, следующая строка работает в окнах и заменяет точки с запятой в моих переменных пути символом новой строки. Я использую инструменты, установленные в моем каталоге git bin.
echo %path% | sed -e $'s/;/\\n/g' | less
$ echo $PATH | sed -e $'s/:/\\\n/g'
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin
...
У меня работает на Мохаве
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
.
мы можем сделать это и в sed.
вы можете попробовать это,
sed -i~bak 's/\,/\n/g' file
-i - изменит модификацию файла. Будьте осторожны, чтобы использовать эту опцию.
Надеюсь, это поможет вам.