Давайте протестируем ваши установки 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
Для этого используйте 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=\|
снова возвращает или печатает поля с указанным разделителем |
.
Вы могли бы сделать
sed 's/\(|[^| ]*\) */\1\&/4;s//\1\&/2'
для вашего примера. Объяснение:
|[^| ]*
ищет ваш разделитель полей и все не -пробелы в этом столбце. Он сгруппирован с \(\)
, поэтому позже его можно скопировать с заменой на \1
. Затем один или несколько пробелов будут заменены &
, которые необходимо экранировать в строке замены. 4
означает применить это к четвертому вхождению, которое является пятой колонкой. Затем повторите это с 2
для третьего столбца. Вам не нужно повторять шаблон, давая пустой шаблон.
Более сложно, если в столбце может быть более одной группы пробелов или их может не быть вовсе. Тогда лучше используйте другой инструмент, например awk
.
С другой стороны, если вы знаете, что в каждом столбце всегда есть один пробел, выполните простой
sed 's/ /\&/5;s//\&/3'
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
литералом &
. Когда закончите, просто распечатайте поля.