2015-09-28 2 views
0

У меня есть файл "Foo.md", который содержит три линии:Рубин возвращается фактические переводы строк вместо п

Foo 

Bar 

Я хочу File.read("Foo.md") вернуться "Foo\n\nBar" Он делает это, когда я запускаю его из IRB в терминале, но когда я запускаю его из сценария, такого как

content = File.read('Foo.md') 
puts content 

он возвращается с линиями, преобразованными в фактические данные. Мне нужна эта переменная как одна строка для следующего в моем скрипте.

Чтобы быть ясным: меня не интересует изменение количества строк, просто отладка, чтобы убедиться, что переменная content передается как одна строка.

+1

это не должно быть "Foo \ п \ п \ NBAR \ п"? – moeabdol

+0

Вы хотите подражать поведению irb? Или вы делаете это, потому что хотите избежать специальных символов? То есть, вы хотите посмотреть на переменную для целей отладки или просто хотите разместить все на одной строке? – Schwern

+1

Спасибо всем до сих пор. Просто для того, чтобы быть абсолютно ясным: файл имеет три строки, поэтому на самом деле это «Foo \ n \ nBar». Но точное число «\ n» s не является проблемой: как полагает @Schwern, я пытаюсь посмотреть на переменную для отладки и убедиться, что она правильно передана в следующий раздел скрипта, что требует одна строка без пробелов. – craigeley

ответ

3

Вы по-прежнему читаете "Foo\n\n\nBar". Однако puts интерпретирует специальные символы.

Вы можете использовать String#inspect:

puts content.inspect # => "Foo\n\n\nBar" 
+2

'puts' не интерпретирует символы,' inspect' кодирует их. –

+0

Это небезопасно. Он будет помещен в кавычки. Он также сделает неправильную вещь, если объект не является объектом String, он покажет класс. Формат ['Object.inspect'] (http://ruby-doc.org/core-2.2.3/Object.html#method-i-inspect) не должен полагаться на что-либо, кроме человека, читаемого. Поведение 'inspect' может быть отменено. – Schwern

+0

@Schwern Как результат чтения файла не является строковым объектом? – sawa

1
str = 
"Foo 


Bar" 
    #=> "Foo\n\n\nBar" 

Вы также можете сделать это:

str.gsub(/\n{3,}/,"\n\n") 
    #=> "Foo\\nnBar" 
+2

Слушай, Ма! Нет нисходящих (пока)! –

+0

Но OP хочет два '\ n' s. – sawa

+0

Спасибо, @sawa, пропустил это. Слишком плохо, так как я не часто получаю возможность использовать 'squeeze'. –

1

Это может помочь вам визуализировать то, что происходит, размышляя об этом:

str = <<EOT 
Foo 


Bar 
EOT 

str «ы содержание выглядеть следующим образом:

str # => "Foo\n\n\nBar\n" 

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

str.inspect # => "\"Foo\\n\\n\\nBar\\n\"" 

inspect выход изменяется при просмотре в сравнении с IRB консоли. Вот то, что вы видите в консоли:

ruby -e 'puts "\n"; puts "\n".inspect' 

"\n" 

str Печать на консоль:

puts str 
# >> Foo 
# >> 
# >> 
# >> Bar 
Смежные вопросы