Я использовал
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 ?
Вопрос сводится к, "Как я заключаю одинарные кавычки в кавычки/использую в единственной заключенной в кавычки строке"?
Этот ответ на 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
Здесь s
es обозначают единственную заключенную в кавычки строку и d
s двойной заключенный в кавычки промежуток одинарной кавычки. С тех пор существует не такой +
оператор в ударе, необходимо засунуть их вместе без любого промежутка пробелов и это дает '"'"'
.
С тех пор нет никаких символов в Вашем regex шаблоне, который оболочка развернет когда в двойных кавычках (такой как $
или !
например), можно просто использовать двойные кавычки вокруг целого выражения:
$ echo "foo 'bar' baz" | sed "s/'bar'/'BAR'/"
foo 'BAR' baz
Посмотрите, например, Одинарную кавычку в двойных кавычках и справочнике Bash