Заключить все числа в JSON в кавычки

Команда lsof является достаточно полнофункциональной и позволяет задавать множество различных критериев поиска. В частности, опция -i позволяет искать по интернет-адресу, включая протокол, делая grep ненужным. Поэтому можно заменить

lsof | grep TCP

на

lsof -i TCP

lsof также позволяет указать интересующие вас поля с помощью опции -F и выводить только их (по одному в каждой строке). Таким образом, мы можем

lsof -i TCP -F 'p'

вывести список PID для процессов, использующих TCP.

Однако, каждый из этих PID имеет префикс "p" (например, "p156"), поэтому, наконец, мы можем использовать cut, чтобы получить только числовой ID. Это дает нам окончательную команду

lsof -i TCP -F 'p' | cut -c 2-

Конечно, ответ @RobertL тоже вполне подходит, но я люблю бросать вызов самому себе, чтобы не использовать AWK для решения всех моих проблем с обработкой текста.

10
05.03.2019, 11:47
3 ответа
perl -pe 's/("(?:\\.|[^"])*")|[^\s[\]{}:,"]+/$1||qq("$&")/ge' file.json

Цитирует все, что не цитируется и не является []{}:,whitespace, так же цитирует числа true, falseи null.

perl -pe 's/("(?:\\.|[^"])*")|-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?/$1||qq("$&")/ge'

Будет специально указывать то, что соответствует спецификации числа json и что еще не заключено в кавычки.

Они выполняют точную токенизацию на основе спецификации JSON, это не приближение.

5
27.01.2020, 19:59
$ jq 'map_values(tostring)' file.json
{
  "id": "1",
  "customer": "user",
  "plate": "BMT-216-A",
  "country": "GB",
  "amount": "1000",
  "pndNumber": "20000",
  "zoneNumber": "4"
}

Перенаправить на новый файл, а затем переместить его на исходное имя файла.

Для более тщательного преобразования чисел в не -плоских структурах в строки рассмотрим

jq '(..|select(type == "number")) |= tostring' file.json

Это будет рекурсивно проверять каждое значение в данном документе и выбирать те, которые являются числами. Затем выбранные значения преобразуются в строки. Строго говоря, он также будет смотреть на ключи, но, поскольку они не могут быть простыми числами в JSON, ключ не будет выбран.

Пример:

$ jq. file.json
{
  "a": {
    "b": 1
  },
  "b": null,
  "c": [
    1,
    2,
    "hello",
    4
  ]
}
$ jq '(..|select(type == "number")) |= tostring' file.json
{
  "a": {
    "b": "1"
  },
  "b": null,
  "c": [
    "1",
    "2",
    "hello",
    "4"
  ]
}

Чтобы дополнительно процитировать null, замените select()на

.
select(type == "number" or type == "null")
30
27.01.2020, 19:59

Я попробовал метод, описанный ниже, и он работал нормально.

Я конвейерил 2 раза, чтобы уменьшить его до своего уровня

Команда:

sed 's/[0-9]\{1,\},\?$/"&/g' filename |
sed '/[0-9]\{1,\}$/s/[0-9]\{1,\}/&"/g'|
sed '/[0-9]\{1,\},$/s/,$/"&/g`'

Выход:

 {
        "id":"1",
        "customer":"user",
        "plate":"BMT-216-A",
        "country":"GB",
        "amount":"1000",
        "pndNumber":"20000",
        "zoneNumber":"4"
}
-1
27.01.2020, 19:59

Теги

Похожие вопросы