Sed заменить слова в кавычках

Вы можете сделать это с помощью Awk:

awk 'BEGIN{exit 9}'

Или Сед:

sed Q9 /proc/stat
0
07.05.2020, 15:30
2 ответа

Основная проблема с вашей собственной попыткой заключается в том, что "*"означает "соответствие нулю или более двойным кавычкам, за которыми следует еще одна двойная кавычка". Это связано с тем, что *является модификатором регулярного выражения, который означает «ноль или более предыдущего выражения». Это означает, что "*"будет соответствовать таким строкам, как ", "", """и т. д.

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


Есть несколько способов сделать это с помощью sed, но все они должны так или иначе соответствовать строке, заключенной в двойные кавычки. Строка между двойными кавычками может быть сопоставлена ​​с регулярным выражением "[^"]*", т. е. «сопоставить двойную кавычку, а затем ноль или более символов, не являющихся двойными кавычками, за которыми следует еще один символ двойной кавычки».

$ sed -e 's/-s "[^"]*"/-s "1"/' -e 's/-e "[^"]*"/-e "2"/' file
abc -s "1" -e "2" def
abc -s "1" -e "2" def
abc -s "1" -e "2" def

В приведенном выше примере используются два отдельных выражения для сопоставления и замены строк после данной опции, что также означает, что

  • не имеет значения, в каком порядке задаются параметры во входных данных(-s "whatever"всегда будет заменяться на -s "1", а -e "whatever"всегда будет заменяться на -e "2"),
  • делает его безразличным к количеству пробелов между параметрами (изменяется, например. от -s "[^"]*"до -s *"[^"]*", чтобы также разрешить несколько пробелов между параметром и аргументом параметра ),
  • не имеет значения, могут ли присутствовать другие параметры (и как они упорядочены по отношению к параметрам -sи -e
  • Если присутствует только один из -sи -e, но не другой, присутствующие опция и аргумент опции -будут заменены.

Если вам дополнительно нужно делать замены только в строках, начинающихся сabc:

sed -e '/^abc/{' -e 's/-s "[^"]*"/-s "1"/' -e 's/-e "[^"]*"/-e "2"/' -e '}' file

или без всех этих опций -eв команде sed:

sed '/^abc/{ s/-s "[^"]*"/-s "1"/; s/-e "[^"]*"/-e "2"/; }' file

Измените /^abc/на /^abc.*def$/, если вам дополнительно нужно убедиться, что строки, которые вы изменяете, заканчиваются на def.

2
28.04.2021, 23:16

Sed использует регулярные выражения, а не шаблоны подстановочных знаков. *означает «повторить предыдущий элемент ноль или более раз», и вам нужно повторить ., что означает «что угодно»:

sed 's/-s ".*" -e ".*"/-s "1" -e "2"/'
1
28.04.2021, 23:16

Теги

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