grep and UTF-8
I needed to look up the various strings Apple uses to name the iTunes Library. First I tried to get name from the iTunes resource bundle
echo "this won't work..." echo "so don't even try it" cd /Applications/iTunes.app/Contents/Resources/English.lproj cat Localizable.strings | grep 'PrimaryPlaylistName'
But I quickly learned that grep doesn’t work on the strings file. Why? Because Apple string files are not UTF-8. They are UTF-16. Usually. But in this case they are. I wanted to iterate over the set of resource strings and extract just the string I wanted.
First I had to convert the file from UTF-16 to another format. Really, the only format that makes sense is UTF-8. After a bit of trial and error, I finally had my script just so.
#!/bin/bash cd /Applications/iTunes.app/Contents/Resources/ # file to look inside of f='Localizable.strings' # string to search for s='PrimaryPlaylistName' # look for directories of the form *.lproj # for d in `ls -1 | grep 'lproj'` ; do echo -n "${d}: " iconv -f UTF-16 -t UTF-8 ${d}/${f} | grep "${s}" done
That’s it. That’s the script. Slap that puppy in a file (e.g., foo) and fire it off.
$ ./foo Dutch.lproj: "kMusicLibraryPrimaryPlaylistName" = "Bibliotheek"; English.lproj: "kMusicLibraryPrimaryPlaylistName" = "Library"; French.lproj: "kMusicLibraryPrimaryPlaylistName" = "Bibliothèque"; German.lproj: "kMusicLibraryPrimaryPlaylistName" = "Mediathek"; Italian.lproj: "kMusicLibraryPrimaryPlaylistName" = "Libreria"; Japanese.lproj: "kMusicLibraryPrimaryPlaylistName" = "ライブラリ"; Spanish.lproj: "kMusicLibraryPrimaryPlaylistName" = "Biblioteca"; da.lproj: "kMusicLibraryPrimaryPlaylistName" = "Bibliotek"; fi.lproj: "kMusicLibraryPrimaryPlaylistName" = "Kirjasto"; ko.lproj: "kMusicLibraryPrimaryPlaylistName" = "보관함"; no.lproj: "kMusicLibraryPrimaryPlaylistName" = "Bibliotek"; pl.lproj: "kMusicLibraryPrimaryPlaylistName" = "Biblioteka"; pt.lproj: "kMusicLibraryPrimaryPlaylistName" = "Biblioteca"; pt_PT.lproj: "kMusicLibraryPrimaryPlaylistName" = "Biblioteca"; ru.lproj: "kMusicLibraryPrimaryPlaylistName" = "Медиатека"; sv.lproj: "kMusicLibraryPrimaryPlaylistName" = "Bibliotek"; zh_CN.lproj: "kMusicLibraryPrimaryPlaylistName" = "资料库"; zh_TW.lproj: "kMusicLibraryPrimaryPlaylistName" = "資料庫";
If I were better at command line perl, I could make a nice formatted table. That is, if I were better at perl.