Я знаю довольно много о символах экранирования в BASH. Я знаю, что \
экранирует следующий символ, " "
экранирует все символы, кроме $
и "
, и, наконец, ' '
экранирует все символы, кроме '
. Так что если, например, у меня есть текст с некоторыми одинарными кавычками ', я могу поместить " " вокруг него, чтобы он вел себя как одна текстовая строка. Проблема у меня возникает, когда мой файл содержит как двойные, так и одинарные кавычки. Тогда я не могу использовать ни один из типов кавычек для его экранирования. Так как мне попросить bash обрабатывать его как одну строку?
Контекст: Файл /var/mobile/Library/Safari/History.plist моего iPhone. Он содержит что-то вроде:
<key>
<string>http://example.com/folder/index.html</string>
<string>Title of Webpage which may include ' and "</string>
</key>
Я хочу cat
файл, пропустить его, grep
чтобы взять первую строку, содержащую текст string
, и извлечь из нее URL. Но grep
он захлебывается всеми кавычками.
Редактировать 1: Вот несколько скриншотов того, как nano не может прочитать файл. Cat выдает похожий вывод. Графический редактор файлов iFile читает его как текст. http://cloudrac3r.ddns.net/strange.html Мне сказали, что это то, что делают бинарные файлы. Я проведу несколько экспериментов.
решение1
Если вы введете строку буквально в команду, вы сможете экранировать символы по своему желанию.
grep 'Title of Webpage which may include '\'' and "' /var/mobile/Library/Safari/History.plist
grep "Title of Webpage which may include ' and \"" /var/mobile/Library/Safari/History.plist
Также обратите внимание, что cat
это не обязательно.
Более того, для обработки XML гораздо лучше использовать инструмент, поддерживающий XML.
xmllint -xpath \
'//key[string=concat("Title of Webpage which may include '\'' and ", '\''"'\'')]' \
/var/mobile/Library/Safari/History.plist
решение2
(Преобразовано в ответ)
Я использовал plutil
команду для преобразования plist в надлежащий текст, поскольку это был 'двоичный файл'. После этого grep
не возникло никаких проблем с управлением файлом.