Команда UNIX для замены внутри разделителя на основе позиции разделителя

Давайте протестируем ваши установки Ruby. В каждой установленной вами версии Ruby запустите этот небольшой фрагмент:

require 'tk'

root = TkRoot.new { title "Hello, World!" }
TkLabel.new(root) do
   text 'Hello, World!'
   pack { padx 15 ; pady 15; side 'left' }
end
Tk.mainloop

Что произойдет, когда вы запустите это?


Решение

Проверив вашу установку, я пошел на поиски и нашел этот небольшой фрагмент кода во всех ебилдах папка в / usr / portage / dev-lang / ruby ​​:

# The Tk module can no longer be built because the module code is no
# longer compatible with newer stable versions.
# https://bugs.gentoo.org/show_bug.cgi?id=500894

Я представляю Ошибка 500894 - dev-lang / tcl 8.5.15 и 8.6.1-r1 необходимы на ~, но только 8.5.15 может быть установлен для вашего удовольствия от чтения. Рассмотрите возможность использования другого инструментария графического интерфейса. В дереве доступны следующие варианты:

  • kde-base / qtruby
  • dev-ruby / fxruby

5
03.08.2017, 10:59
3 ответа

Для этого используйте awk:

awk -F\| '{gsub(" ","\\&",$3); gsub(" ","\\&",$5)}1' OFS=\| infile.txt 
  • -F\|, сообщая 'awk', что поля ограничены |вертикальной чертой (экранированы \для оболочки, не интерпретируют это как pipeline stdin, мы могли бы использовать -F"|"или либо-F'|').

  • Синтаксис gsub("regexp","replacement"[, INDEX]), используемый для замены" "(пробела )литералом &в индексе (, столбце)$3и $5, ниже показывает каждую позицию индекса на основе разделителя |.

    a a|b b|c c|d d|e e
    ^^^|^^^|^^^|^^^|^^^
    $1 |$2 |$3 |$4 |$5
    

    Подробнее о почему мы сбежали \\&туда и два раза?!

  • Что такое 1используется в конце в awk '{...}1'? это элемент управления действиями awk по умолчанию для печати. подробнее

  • Команда OFS=\|снова возвращает или печатает поля с указанным разделителем |.

12
27.01.2020, 20:31

Вы могли бы сделать

sed 's/\(|[^| ]*\) */\1\&/4;s//\1\&/2'

для вашего примера. Объяснение:

|[^| ]*ищет ваш разделитель полей и все не -пробелы в этом столбце. Он сгруппирован с \(\), поэтому позже его можно скопировать с заменой на \1. Затем один или несколько пробелов будут заменены &, которые необходимо экранировать в строке замены. 4означает применить это к четвертому вхождению, которое является пятой колонкой. Затем повторите это с 2для третьего столбца. Вам не нужно повторять шаблон, давая пустой шаблон.

Более сложно, если в столбце может быть более одной группы пробелов или их может не быть вовсе. Тогда лучше используйте другой инструмент, например awk.

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

sed 's/ /\&/5;s//\&/3'
8
27.01.2020, 20:31
perl -aF'(\|)' -lne 's/\h/&/ for @F[2*2,2*4]; print @F' input_file

Результаты

a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j

Работа

Разбить текущую запись на канал |, а также включить разделитель в поля. Следовательно, 3-е и 5-е поля становятся 2 *2 и 2 *4 полями.

Для обоих этих полей мы заменяем горизонтальный пробел \hлитералом &. Когда закончите, просто распечатайте поля.

7
27.01.2020, 20:31

Теги

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