Я использую, egrep -R
за которым следует регулярное выражение, содержащее около 10 объединений, например:
.jpg | .png | .gif
и т.д. Это работает хорошо, теперь я хотел бы заменить все найденные строки на.bmp
Я думал о чем-то вроде
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
так что проблема здесь в том, как мне сделать аналогичное регулярное выражение объединения sed
и как мне сказать ему сохранить изменения в файле, из которого он получил ввод.
Ответы:
Используйте эту команду:
egrep
: найти совпадающие строки с помощью расширенных регулярных выражений-l
: только список совпадающих имен файлов-R
: рекурсивный поиск по всем заданным каталогам-Z
: использовать\0
как разделитель записей"\.jpg|\.png|\.gif"
: Матч с одной из строк".jpg"
,".gif"
или".png"
.
: начать поиск в текущем каталогеxargs
: выполнить команду с аргументом stdin-0
: использовать\0
как разделитель записей. Это важно, чтобы соответствовать-Z
ofegrep
и не вводить в заблуждение пробелы и символы новой строки во входных именах файлов.-l
: использовать одну строку на команду в качестве параметраsed
: S Tream ред itor-i
: заменить входной файл выходным без резервного копирования-e
: используйте следующий аргумент как выражение's/\.jpg\|\.gif\|\.png/.bmp/g'
: Заменить все вхождения строк".jpg"
,".gif"
или".png"
с".bmp"
источник
sed -r
расширенные регулярные выражения. В этот момент шаблон будет соответствовать тому, что используется в egrep, и вы можете захотеть поместить его в переменную для повторного использования.Честно говоря, как бы я ни любил sed для соответствующих задач, это определенно задача для perl - он действительно более мощный для такого типа однострочных сообщений, особенно для того, чтобы «записать его туда, откуда он пришел» (
-i
переключатель perl делает это для you, и, при желании, также позволяет вам сохранить старую версию, например, с добавленным .bak, просто используйте-i.bak
вместо этого).а не замысловатую работу в sed (если там вообще возможно) или awk ...
источник
sed
... Я думаю, что я либо забыл некоторые флаги для sed, либо у него были ограничения.Другой способ сделать это
Некоторая помощь относительно вышеуказанной команды
Находка выполнит поиск в текущем каталоге, обозначенном
.
-name
имя файла, в моем случае его pom.xml может давать подстановочные знаки.-exec
выполнятьsed
редактор потока-i
игнорировать регистрs
для замены/4.6.0.../
Строка для поиска/5.0.0.../
Строка, которую нужно заменитьисточник
Мне не удалось заставить ни одну из команд на этой странице работать на меня: решение sed добавило новую строку в конец всех обработанных файлов, а решение perl не смогло принять достаточное количество аргументов от find. Я нашел это решение, которое отлично работает:
Это будет рекурсия вниз текущее дерева каталогов и заменить
search_regex
сreplacement_string
в любых файлах , оканчивающихся на.h
или.m
.Раньше я также использовал для этой цели rpl .
источник
попробуйте что-нибудь, используя цикл for
не красиво, но должно сойтись.
источник
|while read i
шаблона позволит осуществлять потоковую передачу и избежать ограничений длины, когда результаты egrep становятся слишком длиннымиВ моем случае я хотел заменить
foo:/Drive_Letter
на.foo:/bar/baz/xyz
В моем случае я смог сделать это с помощью следующего кода. Я находился в том же месте каталога, где хранилась большая часть файлов.надеюсь, что это помогло.
ОБНОВЛЕНИЕ s | foo: / Буква_диска: | foo: / ba / baz / xyz | g
источник
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'