Intereting Posts
не удается добавить файлы на жесткий диск настроить двустороннюю синхронизацию NFS Как исправить ошибку Fontconfig: не удалось прочитать файл конфигурации Нужно ли беспокоиться о «хвосте: непризнанная файловая система типа 0xbeefdead»? получение dnsmasq для выдачи другого IP-адреса для имени домена при подключении клиента dhcp RHEL6 + Ошибка: сжатие xz недоступно Получите нормальный $ PATH при вызове в подоболочке Как я могу получить информацию о статусе оптического диска? Файлы с подключенным файлом Systemd на подключенном диске не загружаются Подавлять файлы восстановления при редактировании конфиденциальных файлов в vi, nvi и vim Chromium – включение модуля расшифровки контента Widevine Помогите понять изменение в Vim Обновление OpenJDK в RHEL 6 Настройка беспроводного интерфейса для нескольких местоположений команда sed добавить несколько строк

Как заменить этот шаблон на новую строку внутри?

Если у меня есть текстовый файл с этим контентом:

someline <!--\ file first read on 2015/01/11 

И я хочу удалить <!--\ и все до тех пор, пока не произойдет "on", как мне это сделать? Ожидаемый результат будет следующим:

 someline 2015/01/11 

Я не могу сделать шаблон, который извлекает даты, потому что 2015/01/11 может быть только Sunday или Yesterday или почти что-нибудь еще. read также может быть что угодно. Я попробовал это с BSD sed :

 sed 's/<!--\ file first .* on//g' 

Но когда я запускаю эту команду, я получаю эту ошибку:

 sed: 1: "s/<!--\ file f ...": unterminated substitute pattern 

Поэтому я попробовал обратную косую черту с экранированием < и ! но я получил ту же ошибку «unterminited substitute pattern». Я попытался установить GNU sed и сделать то же самое, кроме \n , я также gsed 's/<!--:a;N;$!ba;s/\n/file first .* on//g' попробовал gsed 's/<!--:a;N;$!ba;s/\n/file first .* on//g' но Я получил:

 gsed: -e expression #1, char 22: unknown option to `s' 

Может ли sed не делать этого? Если нет, как мне это сделать с помощью любого другого инструмента / языка?

POSIXly:

 $ sed -e '/<!--/{ $!N s/.*on // }' <in >out 

Следующая команда sed должна делать то, что вы хотите:

 sed '/^<!--/{N; s/.*on *//}' inputfile 

Сначала мы ищем регулярное выражение <!-- в начале строки, чем мы используем команду N чтобы добавить к ней следующую строку и удалить (на самом деле заменить ничего) на все и до «включено».

Есть люди, утверждающие, что всякий раз, когда вы используете команду с sed буквами в sed , например N , вы используете неправильный инструмент …

Perl может читать весь файл с -0777 , делает модификатор /s . совпадение с новыми символами:

 perl -0777 -pe 's/<!--\\.*?on //gs' 

*? является «экономной звездочкой», что означает «повторить ноль или более раз, но соответствует кратчайшей возможной».