Как удалить двойные кавычки в выводе jq для синтаксического анализа файлов json в bash?

#bash #shell #variables #curl

#bash #awk #sed #jq

Вопрос:

Я использую jq для анализа файла JSON, как показано здесь. Однако результаты для строковых значений содержат «двойные кавычки», как и ожидалось, как показано ниже:

 $ cat json.txt | jq '.name'
"Google"
 

Как я могу передать это в другую команду, чтобы удалить «»? итак, я получаю

 $ cat json.txt | jq '.name' | some_other_command
Google
 

Что some_other_command я могу использовать?

Комментарии:

1. К вашему сведению, cat foo | bar это значительно менее эффективно, чем bar <foo или его эквивалент <foo bar , особенно если bar такая программа sort может распараллеливать свои операции при задании дескриптора файла с возможностью поиска, в отличие от FIFO (который можно прочитать только один раз от начала до конца). Это означает больше накладных расходов при запуске (вызов /bin/cat ) и больше переключений контекста между пользовательским пространством и ядром (каждая часть содержимого проходит через a read() внутри cat , затем a write() в FIFO cat , а затем a read() внутри вашей целевой программы, вместо того, чтобы переходить непосредственно к последнему шагу).

2. Другой пример случая, когда разница велика cat foo | wc -c , vs wc -c <foo — в последнем случае он может просто выполнить два системных вызова, seek() и tell() для получения точного размера файла теперь имеет значение, какой он длины; в первом случае он должен быть прочитан до конца, даже если этогигабайты содержимого, потому что имеет только cat прямой доступ к исходному файлу и wc не имеет возможности запросить метаданные о нем.

Ответ №1:

Используйте опцию -r (или --raw-output ), чтобы выдавать необработанные строки в качестве выходных данных:

 jq -r '.name' <json.txt
 

Комментарии:

1. Что, если я не хочу ничего отменять и просто хочу убрать кавычки?

2. Похоже, у вас достаточно подробные спецификации, поэтому вам следует задать новый вопрос, чтобы спецификация могла быть предоставлена полностью. Этот обратный метод определения того, что вы хотите (каковы ваши входные данные, каков ваш ожидаемый результат, где проходит граница между вашим кодом jq и bash и т. Д.), бесполезен.

3. Если вы хотите убрать кавычки, оставаясь в jq, это отличает ваш вопрос от вопроса OP, который хотел строку без кавычек в bash . Еще раз, я закончил здесь, пока / если вы не свяжетесь с новым вопросом.

4. Если вы хотите удалить кавычки, просто передайте вывод из этой команды в tr -d '"' .

5. Вопрос о том, можно ли игнорировать какой-либо данный угловой регистр, должен быть, как правило, явным, учитываемым в каждом конкретном случае. В противном случае вы окажетесь в мире, в котором мы живем, где программное обеспечение изобилует ошибками, потому что дизайн не учитывал весь объем возможных входных данных. То есть, если кто-то не изложит в качестве требования , которое " никогда не может существовать как буквальные данные, в отличие от синтаксиса, безответственно предполагать, что это так. (Я работаю в сфере безопасности и вижу ооочень много проблем, ошибочно классифицируемых как сбои «проверки ввода», когда они действительно не подходят для полного домена ввода)