В следующем файле:
Lorem Ipsum Dolor Sit Amet, посвященный Aditiscing Elit. Ut eu metus id lectus vestibulum ultrices. Меценатский хрип
Я хочу удалить все до consectetuer
и все после elit
.
Мой желаемый результат:
consectetuer adipiscing elit.
Как я могу это сделать?
shell-script
text-processing
Мануэл
источник
источник
sed
. Это также может бытьperl
или даже чистый удар.Ответы:
Я бы использовал Сед
Декодировал sed s / find / replace / синтаксис:
s/^.*
- заменить начало в начале строки (^
), затем что-либо (.*
) до ...\(
- начать именованный блокconsectetuer.*elit\.
- сопоставить первое слово, все (.*
) до последнего слова (в данном случае, включая конечную (экранированную) точку), которую вы хотите сопоставить\)
- завершить указанный блок.*
) до конца строки ($
)/
- закончить замену найти раздел\1
- заменить на имя блока между\(
и\)
выше/
- закончить заменуисточник
^
или,$
так как sed попытается найти самый длинный матч. Также вы, возможно, пропустили точку послеelit
, вы можете вставить\.
при необходимости.^
и$
не нужно - я оставил их там, поскольку спрашивающий отметил (изначально), что он был немного новичком, и это может быть полезно в других контекстах.Если каждая строка содержит начальный и конечный паттерн, то самый простой способ сделать это с
grep
. Вместо удаления начала и конца каждой строки вы можете просто вывести содержимое между обоими шаблонами.-o
Вариант в GNUgrep
выводит только матчи:Примечание: как уже упоминалось, это работает, только если каждая строка в файле может быть проанализирована таким образом. Опять же, это 80% всех типичных вариантов использования.
источник
Две петли в AWK:
AWK в gsub:
источник
Perl способ. По сути, это то же самое, что и
sed
ответ MikeV :В
-p
означает «печать каждую строку после применения сценария с заданной-e
». Операторs/foo/bar/
замещения; он заменитfoo
сbar
. Скобки фиксируют шаблон и позволяют использовать его при замене. Первый захваченный шаблон есть$1
, второй$2
и так далее.Таким образом, команда будет сопоставлять все до
consectetuer
(.*consectetuer
), затем доelit
(.*elit
) и все остальное до конца строки (.*
) и заменит это захваченным шаблоном.источник
Я не уверен, почему заголовок этого вопроса был отредактирован « из файла » в « из строки », в то время как ОП не исключает возможность для нескольких строк, даже если пример выглядит как одна строка. Как бы то ни было, здесь может оказаться полезным решение с несколькими строками.
Это работает для перекрестных линий:
Примеры:
ссылка: Расширение параметров оболочки
источник