Как правило, вам следует избегать использования общих инструментов анализа текста для структурированных данных. Поскольку у вас есть файл json, безопаснее и проще использовать специальный анализатор json. В вашем случае вы хотели бы извлечь значение первого элемента массива аргументы
который сам является первым элементом массива верхнего уровня аргументы
, потомок хэша верхнего уровня $quer
:
$ jq '."$quer"."args"[0]["args"]' файл.json
[
"выбрать\n db1.table1 как вкладку1,\n db1.table2 как вкладку2,\n db1.table3 как вкладку3\n из db1.table4 как вкладку4"
]
Отсюда у вас больше нет структурированных данных, и вам нужно прибегать к более грубым методам. Я не знаю, как вы хотите идентифицировать свою целевую строку, вы этого не объяснили. Итак, в зависимости от того, что вы на самом деле хотите, вы можете сделать:
Пропустить строки, начинающиеся с [
или же ]
а затем напечатайте второе слово из оставшихся строк:
$ jq '."$quer"."args"[0]["args"]' file.json | awk '/^[^][]/{print $2}'
db1.table1
Вывести второе слово второй строки
$ jq '."$quer"."args"[0]["args"]' file.json | awk 'NR==2{напечатать $2}'
db1.table1
Напечатайте самый длинный участок без пробелов после строки "выбрать\n
:
$ jq '."$quer"."args"[0]["args"]' file.json | grep -oP '"выбрать\n\s*\K\S*'
db1.table1
Если вы объясните, как именно мы должны знать, какую строку извлечь, я мог бы дать вам более целенаправленный ответ.
Для завершения, в вашем конкретный пример, и я подчеркиваю, что это не будет переносимым и почти наверняка потерпит неудачу, если ваши входные данные каким-либо образом изменятся, вы можете напрямую использовать простые текстовые инструменты:
$ grep -oP '"выбрать\n\s*\K\S*' файл.json
db1.table1
$ awk '$1=="\"выберите\n"{print $2}' файл.json
db1.table1
$ sed -nE 's/.*"выберите\n\s*(\S+).*/\1/p' файл.json
db1.table1