Как включить «Командная строка: packagekit role = 'update-packages'» в команду sed?

Я использовал

cat /var/log/apt/history.log > ~/Desktop/allhistory.log && zcat /var/log/apt/history.log*gz >> ~/Desktop/allhistory.log

для создания ~ / Desktop / allhistory.log .

Я могу запустить

sed -r -i.1 '/(^Commandline: apt-get --no-upgrade|^Commandline: apt full-upgrade|^Upgrade: |^End-Date: |^Error: |^Requested-By: |^Commandline: apt-get autoremove|^Commandline: apt autoremove|^Commandline: apt-get --yes|Commandline: apt-get purge|Commandline: apt purge|^Remove: |^Commandline: apt-get dist-upgrade|^Install: |Commandline: aptdaemon|--reinstall|^Commandline: apt-get --yes --no-install-recommends|^Purge:|^Reinstall )/d' allhistory.log

, чтобы исключить вещи, которые мне не нужны. Но я также хочу включить

Commandline: packagekit role='update-packages'

Когда я пытаюсь

sed -r -i.1 '/(^Commandline: packagekit role=\'update-packages\'|^Commandline: apt-get --no-upgrade|^Commandline: apt full-upgrade|^Upgrade: |^End-Date: |^Error: |^Requested-By: |^Commandline: apt-get autoremove|^Commandline: apt autoremove|^Commandline: apt-get --yes|Commandline: apt-get purge|Commandline: apt purge|^Remove: |^Commandline: apt-get dist-upgrade|^Install: |Commandline: aptdaemon|--reinstall|^Commandline: apt-get --yes --no-install-recommends|^Purge:|^Reinstall )/d' allhistory.log

, я получаю

bash: syntax error near unexpected token `)'

Что мне нужно сделать, чтобы включить Командную строку : packagekit role = 'update-packages' успешно выполнено в команде sed ?

0
задан 9 July 2019 в 17:16

2 ответа

Вопрос сводится к, "Как я заключаю одинарные кавычки в кавычки/использую в единственной заключенной в кавычки строке"?

Этот ответ на stackoverflow.com объясняет это. Использовать

sed -r -i.1 '/(^Commandline: packagekit role='"'"'update-packages'"'"'|^Commandline: apt-get --no-upgrade|
               ^Commandline: apt full-upgrade|
               ....|
               ^Reinstall )/d' allhistory.log

(Я добавил новые строки для удобочитаемости. Отбросьте их в фактической команде.)

В основном это: Замените каждого внутреннего ' с '"'"'. Это:

  • закончите первую строку ',
  • добавьте литерал ' в двойных кавычках ("'"),
  • добавьте следующую часть строки, снова запускающейся с '

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

sed … '...role=' + "'" + 'update-packages' + "'" + '|^Commandline…'
#      ssssssss     d     sssssssssssssss     d     ssssssssssssss

Здесь ses обозначают единственную заключенную в кавычки строку и ds двойной заключенный в кавычки промежуток одинарной кавычки. С тех пор существует не такой + оператор в ударе, необходимо засунуть их вместе без любого промежутка пробелов и это дает '"'"'.

2
ответ дан 24 October 2019 в 00:24

С тех пор нет никаких символов в Вашем regex шаблоне, который оболочка развернет когда в двойных кавычках (такой как $ или ! например), можно просто использовать двойные кавычки вокруг целого выражения:

$ echo "foo 'bar' baz" | sed "s/'bar'/'BAR'/"
foo 'BAR' baz

Посмотрите, например, Одинарную кавычку в двойных кавычках и справочнике Bash

2
ответ дан 24 October 2019 в 00:24

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

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