Как заменить многострочный код с помощью sed?

Недавно я прошел через тот же процесс, используя тот же скрипт. Я не понимаю, почему в документации они по умолчанию устанавливают сборку под /root.

В любом случае, вот обновленный скрипт, который я нашел с некоторыми изменениями, позволяющими вам указывать директории сборки и бинарных файлов...
https://github.com/benbradley/bashbits/blob/master/ffmpeg_build_el.sh

Он будет собирать под /usr/local/src/ и помещать полученные двоичные файлы в /usr/local/bin

Я также сделал следующее, чтобы сделать libmp3lame.so доступным перед сборкой ffmpeg...

cd /usr/local/src
# wget lame source
tar -xzvf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure
make && make install

ldconfig /usr/local/lib

9
19.02.2016, 15:30
3 ответа

Perl приходит на помощь:

perl -i~ -0777 -pe 's/text = "[^"]+"/text = ""/g' input-file
  • -i ~ редактирует файл «на месте», оставляя резервную копию
  • -0777 читает весь файл сразу, а не построчно

Подстановка s /// работает так же, как и в sed (т.е. соответствует text = ", за которым следует что-нибудь но двойные кавычки много раз вплоть до двойных кавычек), но в этом случае это работает для всего файла.

15
27.01.2020, 20:04

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

sed '/text = "/{              # if line matches text = "
:b                            # label b
$!N                           # pull in the next line (if not the last one)
/"$/!bb                       # if pattern space doesn't end with " go to label b
s/".*"/""/                    # else remove everything between the quotes
}' infile

с gnu sed вы можете записать его как

sed '/text = "/{:b;$!N;/"$/!bb;s/".*"/""/}' infile

Это не очень эффективно, лучше просто выберите диапазон / text = "/, /" / , измените первый строку и удалите остальную часть:

sed '/text = "/,/"/{            # in this range
/text = "/!d                    # delete all lines not matching text = "
s/\\/"/                         # replace the backslash with quotes (this is only
}' infile                       # executed if the previous d wasn't executed)

снова, с gnu sed вы можете записать ее как однострочную:

sed '/text = "/,/"/{/text = "/!d;s/\\/"/}' infile
5
27.01.2020, 20:04

Лично я бы сделал это на Perl. Если мы можем предположить, что нет « перед закрытием » , вы можете сделать:

perl -0pe 's/(text\s*=\s*)".*?"/$1""/s' file

-0 проглатывает весь файл, считывая его в объем памяти. -p означает «печатать каждую строку (здесь« строкой »будет весь файл) после применения сценария, заданного параметром -e ». Сам сценарий представляет собой простой оператор подстановки. Он захватит строку текст , за которой следует 0 или более пробелов, = и 0 или более пробелов снова ( текст \ s * = \ s * ) и сохраните его как $ 1 . Затем он заменит захваченный шаблон, а также самую короткую строку в кавычках, которую он найдет, на шаблон ( $ 1 ) и "" . Флаг s составляет . соответствует новым строкам.

3
27.01.2020, 20:04

Теги

Похожие вопросы