Intereting Posts
Wifi внезапно не работает на thinkpad, как в Manjaro, так и в parrot linux Как использовать файлы ПК MonoDevelop с условными именами условных обозначений UNIX? Возможно ли сохранить vnc-сервер после выхода из системы? Что происходит с Google Chrome и удаленными файлами Solaris 10, изменить размер раздела yum groupinstall «Средства разработки» не работает Как установить Broadcom BCM4360 на debian на Macbook pro Как присоединиться к массиву строк, где каждая строка имеет пробелы? Помощь, необходимая для удаления уведомления «Нет почты» в MOTD для Ubuntu 10.10 Как сделать текстовый файл доступным только для локального PHP-файла на сервере – не для всех в Интернете? Подождите, пока процесс завершит ИЛИ, чтобы пользователь нажал клавишу Решение проблемы с разрешениями в сценарии, используемом в качестве оболочки для входа? FreeBSD «Неустранимая двойная ошибка» при вводе пароля шифрования ZFS Как сбросить быстрые клавиши быстрого доступа linux centOS 6.0 с пользовательскими изменениями по умолчанию? USB-флеш-накопитель с жестко закодированным разделом

Добавить кавычки и новый разделитель вокруг слов, разделенных пробелами

У меня есть следующая строка

y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis 

Я хотел бы преобразовать это в

 "y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis" 

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

 $ cat in.txt | sed 's/ /\'$'\n/g' | sed 's/\(.*\)/"\1",/g' | tr -d '\n' "y10_zcis","y10_nom","y10_infl","y20_zcis","y20_infl","y30_zcis", 

Но это похоже на полный провал, и он не заботится о последнем нежелательном (но, возможно, это лучше всего просто удалить после этого)

Ты можешь сделать

 sed -e 's| |", "|g' -e 's|^|"|g' -e 's|$|"|g' in.txt 

где

  • 's| |", "|g' 's| |", "|g' заменит каждое пространство на ", "
  • 's|^|"|g' то время как в начале нет места, вы должны указать с ^ началом строки, так что вы говорите, ставьте " в начале ».
  • 's|$|"|g' , но указав конец каждой строки с $

ОБНОВИТЬ

Как отметил @don_crissti, вы можете сделать это короче со следующим

 sed 's| |", "|g;s|.*|"&"|' 

где

  • ; разделять каждую инструкцию
  • .* соответствует всей строке.
  • & амперсанд на RHS заменяется всем выражением, соответствующим LHS, в данном случае .*

    RHS = Правая сторона

    LHS = Левая сторона

Возможно, awk

 awk -vOFS=', ' '{for (k=1; k<=NF; ++k) $k="\""$k"\""; print}' file "y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis", "y30_nom", "y30_infl" 

Ты можешь сделать:

 sed 's/\([^ ]\+\)/"\1",/g; s/,$//' file.txt 

Пример:

 % sed 's/\([^ ]\+\)/"\1",/g; s/,$//' <<<'y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis' "y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis" 

Использование Perl:

 perl -lane '$,=", "; foreach(@F) {s/^|$/"/g; push(@f, $_)}; print(@f)' <<<'y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis' 
  • $, = ", " : устанавливает разделитель выходного поля в,;
  • foreach(@F) {s/^|$/"/g; push(@f, $_)} : для каждого поля, разделенного пробелом, обертывает поле в двойные кавычки и добавляет его @f ;
  • print(@f) : печатает элементы @f разделенные разделителем полей вывода.
 % perl -lane '$,=", "; foreach(@F) {s/^|$/"/g; push(@f, $_)}; print(@f)' <<<'y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis' "y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis" % 

Предполагая, что вы используете bash, и ваша строка уже находится в переменной:

 $ a="y10_zcis y10_nom y10_infl y20_zcis y20_infl y30_zcis" $ 

Тогда вы можете сделать это:

 $ echo \"${a// /\", \"}\" "y10_zcis", "y10_nom", "y10_infl", "y20_zcis", "y20_infl", "y30_zcis" $ 

Еще один способ, используя оболочку ( for , printf ) и окончательный sed hack:

 ( for word in $(cat in.txt) do printf '"%s", ' $word; done; printf '"\n' ) | sed 's/, "$//'