Как заменить какой-то конкретный контент (из разных строк) файла командой sed?

Я хотел бы знать, как заменить это:

.otros{
   position: fixed;
   top: 116px;
   z-index: 100;
   left: 0;
}

на это:

.otros{
   position: fixed;
   top: 70%;
   z-index: 100;
   left: 0;
} 

Содержание файла аналогично следующему:

.social a:not(:hover){
    width: 70px;
    -webkit-transition: 600ms;
    -o-transition: 600ms;
    -ms-transition: 600ms;
}
.social div a:not(:hover){
    width:200%;
}
.otros{
    position: fixed;
    top: 116px;
    z-index: 100;
    left: 0;
}

Эта команда не работает:

sed 's/.otros{\ntop*:*;\n}/.otros{\ntop:70%;\n}/g' estilos.css

Результат:

.social a:not(:hover){
    width: 70px;
    -webkit-transition: 600ms;
    -o-transition: 600ms;
    -ms-transition: 600ms;
}
.social div a:not(:hover){
    width:200%;
}
.otros{
    position: fixed;
    top: 116px;
    z-index: 100;
    left: 0;
}

Как заменить определенные строки?

3
задан 16 September 2019 в 22:09

2 ответа

Замена Sed воздействует на отдельные строки по умолчанию; для выполнения соответствия в многострочном контексте, необходимо будет использовать N управляйте для чтения дополнительных строк в пространство шаблона.напр.:

$ sed '/\.otros{/ {N;N;s/top: 116px/top: 70%/}' estilos.css 
  .social a:not(:hover){
    width: 70px;
    -webkit-transition: 600ms;
    -o-transition: 600ms;
    -ms-transition: 600ms;
  }
  .social div a:not(:hover){
    width:200%;
  }
  .otros{
    position: fixed;
    top: 70%;
    z-index: 100;
    left: 0;
  }
1
ответ дан 1 December 2019 в 16:15

Следующий сценарий Perl соответствует всему между .otros{ строка и top: строка и замены top: строка top: 70%;:

perl -pe 's/(?!\.otros\{[\w\d\s:;\-%]*)top:.*/top: 70%;/' estilos.css

Если строки между .otros{ строка и top: строка содержит что-либо еще, чем:

  • строчные буквы, прописные буквы, символы нижнего подчеркивания (\w)
  • числа (\d)
  • пробел (\s)
  • двоеточие (:)
  • точка с запятой (;)
  • тире (\-)
  • символ процента (%)

просто добавьте его между квадратными скобками ([]).

Результат:

.social a:not(:hover){
    width: 70px;
    -webkit-transition: 600ms;
    -o-transition: 600ms;
    -ms-transition: 600ms;
}
.social div a:not(:hover){
    width:200%;
}
.otros{
    position: fixed;
    top: 70%;
    z-index: 100;
    left: 0;
}

Примечание: Этот сценарий не заменяет top: 116px; только, но все после top: (top:.*) внутри .otros. Например, это также заменило бы top: 55px; или top: 90%;.

Если просто необходимо заменить top: 116px;, затем команда была бы этим:

perl -pe 's/(?!\.otros\{[a-zA-Z0-9\s:;\-%]*)top: 116px;/top: 70%;/' estilos.css
2
ответ дан 1 December 2019 в 16:15

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

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