2015-09-24 3 views
1

Я хочу вставить ряд строк из файла, скажем что-то вроде 210,221r перед первым вхождением шаблона в кучу других файлов.Sed - вставить определенные строки из файла перед первым вхождением шаблона

Поскольку я явно не эксперт GNU sed, я не могу понять, как это сделать.

Я попытался

sed '0,/pattern/{210,221r file 
}' bunch_of_files 

Но, видимо file считывается из строки 210 EOF.

ответ

1

Попробуйте это:

sed -r 's/(FIND_ME)/PUT_BEFORE\1/' test.text 
  • -renables extendend регулярные выражения
  • строка, которую вы ищете ("FIND_ME") находится внутри скобок, создающая захвата группы
  • \1 Переводит захваченный текст в замену.

О втором вопросе: Вы можете прочитать замену из файла, как этот *:

sed -r 's/(FIND_ME)/`cat REPLACEMENT.TXT`\1/' test.text 

Если заменить специальные символы внутри REPLACEMENT.TXT заранее с sed вы золотой.

* = это зависит от вашего эмулятора терминала. Он работает в bash.

+0

Моя проблема в том, что PUT_BEFORE имеет несколько строк и содержит множество специальных символов, которые нужно будет экранировать, поэтому я хочу прочитать их из файла, в котором он уже находится. Я думаю, что могу создать временный файл, содержащий только эти строки и прочитать его, но я хотел бы знать, доступны ли диапазоны чтения с помощью GNU sed. – hdl

+0

Я отредактировал свой ответ. – dummy

+0

Спасибо, это полезно, но я только что нашел ответ, который избавляет от дополнительной стоимости вызова 'cat' или другого экземпляра' sed'. Я опубликую его ниже, но, тем не менее, он не решает проблему чтения * конкретных * строк файла. – hdl

0

В https://stackoverflow.com/a/11246712/4328188 CodeGnome дал некоторые «SED черной магии»:

Для того, чтобы вставить текст перед шаблоном, вы должны поменять шаблон пространство в трюме пространство перед чтением в файле. Например:

sed '/pattern/ { 
    h 
    r file 
    g 
    N 
}' in 

Однако читать конкретные строки из file, один, возможно, придется использовать раствор двух вызовов, похожий на манекен Ответим. Мне бы понравилось знать одноразовое решение, если это возможно.

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