我用了
cat /var/log/apt/history.log > ~/Desktop/allhistory.log && zcat /var/log/apt/history.log*gz >> ~/Desktop/allhistory.log
创造~/桌面/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命令?
答案1
问题归结为“如何在单引号字符串中引用/使用单引号”?
这个答案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 表示中间的双引号单引号。由于 bash 中没有这样的+
运算符,因此您需要将它们粘在一起,中间不加任何空格,这样就得到了'"'"'
。
答案2
由于正则表达式模式中没有字符在双引号内时 shell 会扩展(例如$
或!
例如),因此您只需在整个表达式周围使用双引号:
$ echo "foo 'bar' baz" | sed "s/'bar'/'BAR'/"
foo 'BAR' baz