如何在 sed 命令中包含“命令行:packagekit role='update-packages'”?

如何在 sed 命令中包含“命令行:packagekit role='update-packages'”?

我用了

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

此处ses 表示单引号字符串,ds 表示中间的双引号单引号。由于 bash 中没有这样的+运算符,因此您需要将它们粘在一起,中间不加任何空格,这样就得到了'"'"'

答案2

由于正则表达式模式中没有字符在双引号内时 shell 会扩展(例如$!例如),因此您只需在整个表达式周围使用双引号:

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

例如双引号内的单引号和 Bash 参考手册

相关内容