Sed, выходящий изнутри Ruby - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть сценарий Ruby, который вызывает 'sed' следующим образом:

    command = "sed -i \"s*#{find_what]}*#{replace_with}*\" #{file} "
    system `#{command}`

Когда у меня есть строка замены, которая занимает несколько строк, она не экранируется должным образом и отображается все на одной строке в файле "".

Что я могу сделать, чтобы правильно экранировать строку, чтобы sed заменил ее на целые разрывы строк?

Спасибо

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011
script = "s*#{find_what}*#{replace_with}*"
system "sed", "-i", "-e", script, file

Таким образом, спасение не требуется.

3 голосов
/ 20 декабря 2011

Я полагаю, что ваш replace_with содержит такие строки:

replace_with = "this should be\non two lines"

Вам нужно будет экранировать \n от интерпретатора Ruby и интерпретатор оболочки, так что они могут быть прочитаны sed(1).Попробуйте это:

replace_with = "this should be \\\\non two lines"

Первое удвоение: \\ до \\\\ - получить все обратные слэши после Ruby.Второе удвоение: от \ до \\ - получить обратную косую черту за оболочкой.sed должен видеть только один \.

Простой тест:

$ cat command.rb 
#!/usr/bin/ruby
#
command = "/bin/echo -e \"first line \\\\n second line\""

print `#{command}`
$ ./command.rb 
first line 
 second line
$ 

Если вы должны использовать sed из скрипта, пожалуйста, используйте основанный на массивеметод выполнения, предложенный Исмаилом и Пгуардиарио .Посетите веселый веб-сайт Общества сохранения идентификаторов процессов , чтобы узнать подробные причины, по которым безопаснее избегать использования оболочки для запуска каждого нового процесса.Лучше, конечно, просто использовать встроенную поддержку Ruby для замены.

2 голосов
/ 20 декабря 2011

Возможно, имеет смысл разбить команду на несколько аргументов, из которых только первые будут расширены

exec '/bin/echo', '-e', 'first line \n second line'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...