Я использую как Linux, так и FreeBSD (в частности, я использую Debian Linux и PC-BSD), и я обнаружил кое-что странное sed
.
Мне часто нужно конвертировать файлы с разделителями табуляции в значения, разделенные запятыми. Самый простой способ, который я знаю, это использовать sed
, например так:
sed 's/\t/,/g' inputFile.txt > outputFile.csv
Это прекрасно работает в Linux: он заменяет каждую вкладку запятой ... но во FreeBSD это ничего не заменяет !!!
Я что-то пропустил? Есть ли синтаксис в FreeBSD sed
, отличный от синтаксиса в Linux?
-E
Опция делает трюк (как на FreeBSD и Mac OS X).Да, есть различные различия, поведение
-i
единственного, которого я знаю, вне головы.Я никогда не использовал BSD, поэтому я не могу помочь с деталями, но
tr
вместо этого можно использовать обходной путь :Приятным побочным эффектом является то, что
tr
должно быть значительно быстрее. Я проверил это на моем Linux, используя тестовый файл с 50000 строками, каждая из которых имела 2 вкладки:источник
tr '\t' ,
является более портативным, чемtr $'\t' ,
.tr '[\t]' '[,]'
будет даже переносимым на некоторые старые системы SysV.cut
. POSIX спецификации дляtr
это есть . Я был неправ насчет[
необходимости для старого SysV. Как указывает эта спецификация POSIX,[
она нужна только для диапазонов.Да, в отличие от GNU
sed
FreeBSDsed
не интерпретирует escape-последовательности ANSI C, такие как\t
регулярные выражения.Один из способов получить наименее распространенный знаменатель в этом случае - использовать
printf
.Поведение
sed -i
для редактирования файлов на месте можно сделать совместимым, если сразу за ним следует переключатель или опция-i
, например,sed -i -e 's/x/X/g' file
работает как для GNU,sed
так и для FreeBSDsed
.Последние версии FreeBSD
sed
(FreeBSD 8.1 или новее) имеют-r
переключатель для повышения совместимости с GNUsed
.(Кроме того, использование классов символов POSIX в
sed
регулярных выражениях также является хорошим способом обеспечения совместимости).В качестве альтернативы POSIX-совместимой
sed
реализации см .: минимизированный - меньшая, более дешевая и быстрая реализация SED .источник
Вы должны использовать буквенный TABсимвол вместо
\t
:Смотрите этот комментарий Стефана по другому вопросу.
Следующая статья также может вас заинтересовать:
Я цитирую соответствующую часть:
источник
После входа в систему я вижу следующее объявление и сохраняю его. Надеюсь, это будет полезно и для других
источник
-i
вариант был покрыт уже , хотя