If you’ve ever gone to apt-get remove
something with tab-completion and it baulks out with:
grep-status: /var/lib/dpkg/status:26787: expected a colon
… you’re suffering from some corruption. Opening the file at the given line rarely shows the right error because formatting issues in the file causes a cascade error and it only detects a break much further on.
The required formatting in this file is truly bizarre.
Package: a-package-name
Status: install ok installed
Other-Fields: blah
Description: The description may have many lines
but double-breaks need a full-stop.
.
Like that.
Package: a-bad-package
Status: install ok installed
Other-Fields: blah
Description: Some packages aren't well formed.
And break the rules. This is an example of a bad description
And there’s a blank newline between packages. So if a package gets inserted into the local database and it doesn’t follow these guidelines, dpkg
breaks. In my case it has only ever broken the remove-tab-completion (as provided by grep-status
) but I’ve always found it very hard to fix… Until now.
What we need is a tool that can search for multiple newlines where the first thing on the next line isn’t Package:
. grep
can’t do multi-line so we have to turn to pcregrep
. It’s as simple as this:
sudo apt-get install pcregrep
pcregrep -nM '\n\s*\n[^P]+' /var/lib/dpkg/status
This will return a block of text and a line number like so:
$ pcregrep -nM '\n\s*\n[^P]+' /var/lib/dpkg/status
25643: The program uses wiper.sh to TRIM disks.
wiper.sh is part of the open source project hdparm
and can be obtained from the hdparm web page.
https://sourceforge.net/projects/hdparm/
Homepage: http://disktrim.sourceforge.net
Then we just nano into the file (using the plus-argument to go straight to the right place):
sudo nano +25643 /var/lib/dpkg/status
And edit the description so any blank lines just start with a .
. Save it and run a sudo apt-get update
and you’ll find that apt-get remove
tab-completion works!