Есть ли проблема с sed и символом новой строки?
У меня есть файл test.txt со следующим содержимым
aaaaa
bbbbb
ccccc
ddddd
Следующее не работает:
sed -r -i 's/\n/,/g' test.txt
Я знаю, что могу использовать tr
для этого, но мой вопрос, почему это не представляется возможным с помощью sed.
Если это побочный эффект обработки файла строка за строкой, мне было бы интересно, почему это происходит. Я думаю, grep
удаляет новые строки. Делает ли sed то же самое?
tr
добавил бы трейлинг,
и вывел бы неопределенную строку. Лучше всего использоватьpaste
вместо этого:paste -sd , test.txt
Ответы:
С GNU
sed
и при условииPOSIXLY_CORRECT
не в среде (для однострочного ввода):С https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :
:a
N
$!ba
($!
значит, не делать это в последней строке (так как должен быть один последний символ новой строки)).источник
ba: Event not found
sed
команду с этими точными параметрами? На какомtest.txt
файле? С какой версиейsed
(попробоватьsed --version
)?!
. Интересно, что это все еще не сработало для меня, и я закончил тем, что мне пришлось дважды избегать!
в моем.csh
сценарии. Так что у меня сейчас нет особых проблем, но вы знаете, почему это может быть? То, что работало для меня, былоsed :a;N;$\\!ba;s/\n/ /g'
Это работает с GNU
sed
:-z
включен с 4.2.2NB.
-z
изменяет разделитель на нулевые символы (\0
). Если ваш ввод не содержит нулевых символов, весь ввод рассматривается как одна строка. Это может идти со своими ограничениями .Чтобы избежать замены новой строки последней строки, вы можете изменить ее обратно:
(Что
sed
снова является синтаксисом GNU , но это не имеет значения, поскольку все это только GNU)источник
С веб-сайта Oracle:
По сути это означает, что поскольку sed читает строку за строкой, символ новой строки не совпадает.
Решение от https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :
или в переносной версии (без
;
конкатенации после меток меток)Объяснение того, как это работает, приведено на этой странице.
источник
sed
, если POSIXLY_CORRECT находится в среде, а вход имеет только одну строку, выход не будет.sed
всегда удаляет завершающую электронную\n
строку непосредственно перед заполнением пространства шаблона, а затем добавляет ее перед записью результатов своего сценария.\n
Ewline можно был в модельном пространстве различными способами - но никогда , если это не является результат редактирования. Это важно - электронные\n
линии в российскомsed
шаблонном пространстве всегда отражают изменения и никогда не происходят во входном потоке.\n
ewlines - единственный разделитель, на которыйsed
можно рассчитывать с неизвестным вводом.Если вы хотите заменить все электронные
\n
строки запятыми, а ваш файл не очень большой, то вы можете сделать:Это добавляет каждую строку ввода к
h
старому пробелу - за исключением первого, который вместо этого перезаписываетh
старый пробел - после\n
символа ewline. Затем онd
выбирает каждую строку, не$!
последнюю из выходных данных. В последней строкеH
старые и шаблонные поля заменяются,x
и все\n
символы ewliney///
переводятся в запятые.Для больших файлов подобные вещи неизбежно вызывают проблемы -
sed
буфер на границах строк, который может быть легко переполнен действиями такого рода.источник
В качестве альтернативы вы можете использовать немного более простой синтаксис:
... просто меняя порядок последовательности.
источник
s
команду для каждой строки ввода в пространстве шаблонов, которое становится все больше.Здесь есть очень приятная магия седа . И некоторые хорошие моменты, поднятые о переполнении пространства шаблона. Я люблю использовать sed, даже если это не самый простой способ, потому что он такой компактный и мощный. Однако у него есть свои ограничения, и для больших объемов данных пространство шаблонов должно быть махоусивчивым.
GNU говорит это:
Мне нечего добавить, но я хотел бы указать вам на мое руководство для sed . Это отлично http://www.grymoire.com/Unix/Sed.html
и вот мое решение:
хорошо это работает
источник
Допустим, вы хотите заменить символы новой строки на
\n
. Я хотел сделать это, вот что я сделал:Вот что он делает: для всех строк, кроме последней , добавьте
\n
. Затем удалите символы новой строки с помощьюtr
.источник
-r
доступно только в GNUsed
, но не в BSD.