2013-10-25 4 views
0

У меня есть текстовый файл, который имеет следующий контент.Ruby one liner для соответствия нескольким строкам

one two three 
four five six 
seven eight nine 
ten eleven twelve 

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

input = File.new('./test', 'r+') 
content = input.read 
input.close 

modified = content.sub("four five six\nseven eight nine", "") 
print modified 

Я пробовал что-то подобное, но не повезло.

ruby -pe 'gsub(/four five six\nseven eight nine/,"")' < ./test 

Любая идея? Благодаря!

+0

Возможно, регулярное выражение «или» помогло бы: '/ (четыре пять шесть семь восемь девять) /'. В таком случае, как в командной строке, часто бывает, что файл будет считаться по очереди. – abiessu

+0

Почему «один лайнер»? Это искусственное ограничение и, возможно, не лучший способ. Вы хотите «пустое пространство» или хотите усечь согласованный текст? Вы усекаетесь, но говорите, что хотите «пустое пространство», которое является туманным термином. И почему бы просто не использовать 'sed', который будет работать намного быстрее? –

ответ

3

Флаг -p заставляет Ruby «предполагать» while gets(); ... end 'loop around your script "(от ruby -h), тем самым выполняя команду на каждой строке отдельно, а затем печатайте вывод. Вместо этого делать явно gets(nil), чтобы заставить его принять во всем входе сразу, а затем вызвать puts по этому поводу (и добавить еще \n в конце регулярного выражения, чтобы он не оставил пустую строку):

ruby -e 'puts gets(nil).gsub(/four five six\nseven eight nine\n/,"")' < ./test 
one two three 
ten eleven twelve 
1

Повторите попытку "или": /(four five six|seven eight nine)/. В таком случае, как в командной строке, часто бывает, что файл будет считаться по очереди.

2

Быстрая проверка работоспособности; Рубин соответствует новой строки без проблем:

2.0.0-p195 :159 > /abc\ndef/ === "abc\ndef" 
=> true 

Есть некоторые предостережения (используйте модификатор m если вы хотите . соответствовать \n!)

2.0.0-p195 :161 > /.{7}/ === "abc\ndef" 
=> false 
2.0.0-p195 :162 > /.{7}/m === "abc\ndef" 
=> true 

Возможно, у вас есть некоторые пробелы или что-то на концах ваши строки, так что учитывайте это в вашем регулярном выражении (/four five six\s*\nseven eight nine/m)

Смежные вопросы