echo "01/01/2001 05/16/1970 06/08/2010" > datefile
sed 's:[0-1][0-9]/[0-3][0-9]/::g' datefile
Результат:2001 1970 2010
Это будет работать, когда все даты находятся в одной строке, и когда каждая дата находится в отдельной строке. Разделителем является :
для облегчения разборчивости. Глобальная опция g
делает все допустимые замены.
Инструмент jq
, который я использую в этом ответе, может быть загружен изhttps://stedolan.github.io/jq/(даже для Solaris )и установлен в домашнем каталоге не -пользователя root без какого-либо доступа root. Кроме того, он вообще не имеет никаких зависимостей во время выполнения.
В документе JSON нет «второго столбца». Ваш документ также может быть написан
[
{
"FRUIT": "APPLE",
"CAR": "FORESTER",
"COMPANY": "SUBARU",
"MAKE": "2015",
"CITY": "UNION CITY",
"STATE": 0,
"COUNTRY": 0,
"LOCATION": 0,
"RANK": "1"
},
{
"FRUIT": "MANGO",
"CAR": "OUTBACK",
"COMPANY": "SUBARU",
"MAKE": "2017",
"CITY": "EDISON",
"STATE": 0,
"COUNTRY": 0,
"LOCATION": 0,
"RANK": "2"
}
]
Добавленный пробел не влияет на фактические данные JSON.
Чтобы извлечь значения всех записей, соответствующих ключу CAR
, используйте jq
синтаксический анализатор JSON командной строки:
$ jq '.[].CAR' file.json
"FORESTER"
"OUTBACK"
Выражение .[].CAR
означает «Для каждого элемента верхнего -самого массива вернуть значение ключа CAR
».
Если вы хотите, чтобы в выводе не было кавычек, добавьте-r
(или--raw-output
)к вызову jq
. Это вернет декодированные данные.
Вы можете использовать json_xs
, он обычно устанавливается по умолчанию в любой системе, поддерживающей Perl:
json_xs -f json -t json-pretty < file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2
Или с Python:
python3 -m json.tool file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2
Не самый элегантный подход, но он работает с данными вашего примера:
$ tr, '\n' < file | awk -F: '{if(/\{/){NR=1}}NR==2{print $2}'
"FORESTER"
"OUTBACK"
tr
заменит все ,
символами новой строки. awk сбросит переменную NR
по умолчанию на 0
, когда увидит {
. Поскольку NR
содержит текущий номер строки и автоматически увеличивается в каждой строке, это означает, что он будет 2
только во второй строке каждого набора пар значений ключа -. Итак, когда NR
равно 2
, мы печатаем второе поле, разделенное :
-.
В качестве альтернативы используйте подходящий язык сценариев, поддерживающий данные JSON. Например, вperl
:
$ perl -M"JSON" -lne 'my $json = decode_json($_);
foreach $f (@{$json}){print $f->{"CAR"};}' file
FORESTER
OUTBACK
Попробуйте следующую команду
$ sed "s/{/\n/g" file.txt | awk -F, 'NF>=2{split($2,Arr,":");print Arr[2]}'
"FORESTER"
"OUTBACK"
мы разбиваем одну строку на несколько строк с помощью команды sed, затем с помощью awk получаем значение второго столбца
Аналогично ответу Тердона:
sed s'/[,{}]/\n/g' < file.json | grep '^\"CAR\"\:' | cut -d ':' -f2
После заметки Кусалананды о том, что Solaris не поддерживает указанный выше sed
стиль, его можно заменить следующим tr
вариантом:
tr ',{}' '\n' < file.json | grep '^\"CAR\"\:' | cut -d ':' -f2
Rudimentary разбивает json на каждое поле в отдельной строке, заменяя все символы,
{
и }
новой строкой. Затем просматриваем результаты для строк, начинающихся с "CAR":
, и печатаем значение после :
.
Должна быть разумная возможность анализировать все аналогичные настройки json без выполнения слишком сложных действий.