Как я могу найти & amp; заменить первую фразу, в нескольких файлах, содержащих фразу несколько раз?

Я хочу изменить первый фоновый цвет в соответствии со стилем

body {

с того, что он есть, на

background-color: #000000;

в семи различных файлах stylesheets.css через командную строку. Также каждый файл .css содержит более 10 экземпляров, поэтому я хочу изменить только один, следуя коду стиля body {.

3
задан 6 January 2015 в 09:41

3 ответа

Сделайте некоторое изменение согласно своему файлу:

sed  '0,/body{background-color:.*;/s//body{background-color:#000000;/' sample.css

или сделайте это быстро:

sed  '0,/body{background-color:.*;/s//body{background-color:#000000;/' *.css    

sed ':a;N;s/\n/\a/;$!ba;s/body[ \t\a]*{[ \t\a]*background-color:#[0-9a-zA-Z]*;/body\n{background-color:#000000;/;s/\a/\n/g;' *.css

Source:The sed FAQ

2
ответ дан 6 January 2015 в 09:41

Как правило, вам нужно хорошее регулярное выражение, соответствующее вашим потребностям. sed - хороший инструмент для использования, perl - другой. Единственная причина, по которой я предпочитаю perl, заключается в том, что я лучше знаю синтаксис регулярных выражений. Следующая строка должна делать то, что вы хотите:

perl -0777 -i.bak -pe 's/(body {.*?background-color.*?)#.{6}/$1#000000/si;' ./style.css

-0777 означает разделение на пустые места, так что хламить весь файл (вместо строки за строкой по умолчанию используется -p)

-i.bak означает изменение файлов на месте, оставляя оригинал с расширением .bak (по умолчанию -p - просто печатать)

-p означает, что строка за строкой (за исключением случаев, когда мы крадемся) передается в код (см. -e)

-e ожидает выполнения кода.

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

Обязательно проверьте результаты, так как я легко могу представить файлы CSS, которые могут вызвать проблемы с этим выражением. Например, наличие селекторов, содержащих слово body, может вызвать проблемы ...

0
ответ дан 6 January 2015 в 09:41

Я бы попробовал для awk:

gawk -v RS='}[[:space:]]*' '/^body[[:space:]]*{/ { 
  printf "%s%s", gensub (/background-color:[^;]*;/, "background-color: #000000;", 1), RT
}'

Это требует GNU awk (но может быть и без него).

  • Мы устанавливаем разделитель записей на }, за которым следует любое количество пробелов.
  • Тогда мы можем сопоставить body { с началом записи.
  • И заменить background-color: #000000; на первый экземпляр background-color. Замените 1 на g, чтобы соответствовать всем экземплярам.
  • RT содержит текст, сопоставленный разделителем записей. Если бы мы использовали фиксированную строку (}) вместо регулярного выражения, мы могли бы использовать вместо ORS. RT нужен GNU awk.
  • В GNU awk также есть плагин редактирования на месте . Используйте gawk -i inplace ...

По правде говоря, это не работа для регулярных выражений или анализаторов записей. Следует использовать то, что понимает язык CSS.

0
ответ дан 6 January 2015 в 09:41

Другие вопросы по тегам:

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