sed mass заменяет стили CSS через терминал - PullRequest
1 голос
/ 17 декабря 2011

Я хочу заменить все экземпляры font-family: ([A-Za-z ,"]+){1}; на font-family: Verdana, используя sed. В прошлом следующая команда работала для simple search & replace:

find ./ -type f -exec sed -i 's/needle/replace/' {} \;

Однако я попробовал следующее регулярное выражение безуспешно:

find ./ -type f -exec sed -i 's/(font\-family:){1}([\"A-Za-z, ]+){1}(;){1}/font\-family: Verdana;/' {} \;

Я работаю на Red Hat Enterprise Linux Server версии 5.6. Кроме того, кажется, что первая команда работает только с первым экземпляром в любом данном файле, что означает, что мне нужно повторно запускать команду, пока не будет заменен каждый экземпляр ... Могу ли я улучшить команду для работы со всеми экземплярами всех файлов? *

Ответы [ 4 ]

4 голосов
/ 17 декабря 2011

Во-первых, объяснение того, почему ваш не работает.Вам нужно убрать все ваши круглые скобки, квадратные скобки и +, поэтому должно работать следующее:

sed -i 's/\(font\-family:\)\{1\}\(["A-Za-z, ]\+\)\{1\}\(;\)\{1\}/font-family: Verdana;/'

К счастью, вы можете добавить переключатель -r, чтобы избежать необходимости всего этогоэкранирование, но вы также можете немного упростить текущее выражение.Вам не нужно помещать каждый раздел в группу захвата, и добавление {1} в каждую группу является избыточным (это по умолчанию).Таким образом, вы можете уменьшить его до:

sed -ri 's/font-family:["A-Za-z, ]+;/font-family: Verdana;/g'

Обратите внимание на добавленную опцию g для глобальной замены, поскольку вы хотите это для каждого вхождения.

Все вместе:

find ./ -type f -exec sed -ri 's/font-family:["A-Za-z, ]+;/font-family: Verdana;/g' {} \;
1 голос
/ 17 декабря 2011

проблема в том, что вам нужно -r в вашем sed, так как вы использовали +

, см. Тест ниже:

kent$  echo "oldstring_0000"|sed 's/[0]+/newstring/'
oldstring_0000

nothing happened.

now with -r:

kent$  echo "oldstring_0000"|sed -r 's/[0]+/newstring/'
oldstring_newstring

также, если вы хотите заменить все,вам нужно 'g' как 's / a / b / g'

0 голосов
/ 17 декабря 2011

Я не уверен, что полностью понимаю ваше выражение семейства шрифтов: font-family: ([A-Za-z ,"]+){1}; Это совпадающие парены, и вы ищете {1} ровно одно совпадение?

Ваше регулярное выражение достаточно сложное, чтобыЯ бы переключился с sed на perl -pi:

find ./ -type f -exec perl -pi -e 's/font-family:[\"A-Za-z, ]+;/font-family: Verdana;/g' {} \;
0 голосов
/ 17 декабря 2011

Попробуйте что-то вроде этого -

sed -i 's/\(font-family:\) \(.*[^;]\)\(;.*\)/\1 Verdana\3/g'
...