форматирование файла unix txt для определенного поля

С помощью коллеги -я нашел источник проблемы (пользовательскую ошибку )и исправил ее (, удалив и должным образом переустановив Atom ).

TLDR:Убедитесь, что вы выполнили все инструкции по настройке Atom перед установкой Atom через Software Manager. Если вы этого не сделали, возможно, вам придется удалить/настроить/переустановить.

Что я сделал не так:Я неправильно понял инструкции по установке Atom и не смог правильно настроить Software Manager перед установкой, исходя из ложного предположения, что установка с помощью Software Manager была -универсальным средством.

Как я это исправил:Я удалил Atom и заново -установил после , следуя удобному пошаговому руководству по настройке Debian/Ubuntu на странице Инструкции по установке Atom . Оглядываясь назад, это кажется до боли очевидным, но, начиная с Windows, я привык к комплексным установщикам и автоматическим -обновлениям и не понимал цели процесса настройки.

При повторной установке -после правильной настройки команды оболочки работали правильно сразу после установки.

Почему не получилось с первого раза:Я не буду копировать -код вставки сюда (, пожалуйста, обратитесь к странице установки, указанной выше ),но подытожу, если концепции кому-то пригодятся. Инструкции по настройке, предоставляемые Atom, сообщают вашей системе, где искать официальный (и до -до -до -дата )репозиторий файлов Atom, чтобы при установке Atom он был настроен правильно.

Я не уверен, почему первоначальная установка Atom не работала должным образом. Вероятно, репозиторий Software Manager, на который указывалось из коробки, был неполным, устаревшим или иным образом содержал ошибки.

Если у кого-то есть лучшее решение, опубликуйте -этот подход потребовал от меня новой настройки редактора, что было не очень хорошо.

0
08.05.2020, 11:28
1 ответ

В вашем примере вы хотите добавить $COLв конец каждой строки в строке, начинающейся с #. Для этого простого случая вы можете просто сделать:

$ sed -E 's/(#[^#|]*)/\1$COL/g' file
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|abc@gmail.com
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|pqr@gmail.com

Или, если ваш sedне поддерживает-E:

sed 's/\(#[^#|]*\)/\1$COL/g' file

И вы можете использовать -iдля редактирования файла на месте:

sed -i -E 's/(#[^#|]*)/\1$COL/g' file

В более общем случае, чтобы заменить добавление $COLк#-разделенным строкам, но только в 3-м|-разделенном поле, вы можете сделать:

$ awk -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1' file 
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|abc@gmail.com
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|pqr@gmail.com

В более новых версиях GNU awkвы можете использовать -i inplaceдля редактирования файла на месте:

awk -iinplace -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1'

Наконец, просто для удовольствия, вы также можете использовать Perl для изменения всех#-строк defend:

perl -pe 's/(#[^#|]+)/$1\$COL/g' file 

или только для 3-го столбца:

perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g; print join "|",@F' file 

или, чтобы сделать это только в 3-м столбце и пропустить 1-ю строку:

perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g if $.>1; print join "|",@F' file 

В обоих случаях вы можете использовать -iдля редактирования файла на месте.

1
28.04.2021, 23:15

Теги

Похожие вопросы