Вы можете сделать это с помощью Awk:
awk 'BEGIN{exit 9}'
Или Сед:
sed Q9 /proc/stat
Основная проблема с вашей собственной попыткой заключается в том, что "*"
означает "соответствие нулю или более двойным кавычкам, за которыми следует еще одна двойная кавычка". Это связано с тем, что *
является модификатором регулярного выражения, который означает «ноль или более предыдущего выражения». Это означает, что "*"
будет соответствовать таким строкам, как "
, ""
, """
и т. д.
Кроме того, вы без необходимости используете другой разделитель для команды 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
.
Sed использует регулярные выражения, а не шаблоны подстановочных знаков. *
означает «повторить предыдущий элемент ноль или более раз», и вам нужно повторить .
, что означает «что угодно»:
sed 's/-s ".*" -e ".*"/-s "1" -e "2"/'