sed - как сделать несколько последовательных замен, но обработать файл только один раз?


31

Если я делаю несколько замен, которые должны быть последовательными, например

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/' t1_spec.rb
sed -i '/expect(browser.*\.should/s/\.should/).should/' t1_spec.rb
sed -i 's/\.should/\.to/' t1_spec.rb 
sed -i 's/==/eq/' t1_spec.rb 

Есть ли лучший способ сделать это, который будет проходить через t1_spec.file только один раз и делать 4 замены для каждой строки, а не проходить через файл 4 раза?

Ответы:


43

Помимо использования точек с запятой, вы также можете задать для sed более одного выражения, используя -eфлаг:

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 

14

В GNU (например, на моей машине с Ubuntu) поддерживается простое использование нескольких строк, оно работает хорошо и выглядит хорошо (imho), так как избегает очень длинных строк, например

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/
        /expect(browser.*\.should/s/\.should/).should/
        s/\.should/\.to/
        s/==/eq/' t1_spec.rb 

5

Вы можете использовать точки с запятой для разделения различных подстановок между одинарными кавычками или вы можете поместить все эти команды в файл и указать файл с -fопцией sed.

Использование файла особенно полезно, если вы собираетесь использовать один и тот же набор sedкоманд снова и снова. Раньше мне приходилось иметь дело с грязным фидом данных, и со временем massage.sedя получил файл из 88 строк, который вызывался для автоматического устранения большинства распространенных ошибок, которые я получил из фида.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.