#ruby #enumeration
#ruby #перечисление
Вопрос:
У меня есть скрипт командной строки, который возвращает что-то вроде:
col1 col2 col3 col4 col5
a b c d e
a1 b2 c2 d2 e2
a3 b3 c3 d3 e3
..
..
.
Теперь я хочу взять значения из col3, а затем вызвать другой скрипт командной строки для каждой строки в столбце 3.
Я знаю, что в ruby есть системная функция («..»), которая запускает скрипт в консоли.
Мой скрипт командной строки очень похож на вызов чего-то вроде:
system("ls -l")
Теперь, как я мог бы захватить столбец # 3 и выполнить итерацию по каждому значению и запустить другой скрипт, передающий значение из столбца # 3 в качестве параметра?
Комментарии:
1. «Строки значений для каждого столбца», «каждая строка в столбце 3», «строки информации с 9 столбцами», «столбец # 3 и повторять каждое значение»: эти выражения трудны для понимания.
2. сава, я обновил его, ваше право, формулировка была запутанной, надеюсь, это лучше.
Ответ №1:
IO.popen('ls -l').lines.map(amp;:split)[1..-1].transpose[2].each do |e|
puts '>>' e '<<'
end
Я должен предупредить вас, что если вы перейдете к очевидному следующему шагу и создадите вызов «system» или даже popen
внутри блока, вы создадите риск внедрения кода. В этом конкретном случае, когда для владельца файла ожидаются только буквенно-цифровые результаты, простой фильтрации только для этих символов должно быть достаточно.
Комментарии:
1. Я запускаю это локально, и всем входным данным доверяют.
2. Конечно, я так и подозревал. Я бы предпочел ничего не говорить, но публикация простого объяснения здесь, на SO, иногда провоцирует охоту на ведьм с точки зрения безопасности, как будто под угрозой находятся сами золотые коды , поэтому я всегда должен говорить предостережение. Я должен держать его готовым к работе и просто вставить его. Чтобы быть справедливым к inquisitors, некоторые ответы посещались много лет, и мы должны учитывать, что увидят будущие посетители…
3. это очень заботливо с вашей стороны по отношению к веб-сайтам 🙂
Ответ №2:
Вы можете просто иметь что-то вроде
#!/usr/bin/env ruby
cols, take_col = ARGV[0],ARGV[1]
puts $stdin.read.split.drop(cols).select.with_index{|x, i| i % cols == take_col - 1}
в файле, скажем, с именем take-col
, и использовать его с каналом, например
$ ls-like-cmd | take-col 5 3 | next-cmd