3

У меня есть вывод, который выглядит так:

"vancouver/news/vancouver-voices": {
    "status": 0,
    "time": 0,
    "timestamp": 1371298701
},
"vancouver/news/vancouvers-march-second-annual-success": {
    "status": 0,
    "time": 0,
    "timestamp": 1371298701
}

Мне нужно извлечь только частичные URL (например, vancouver/news/vancouvers-march-second-annual-success and vancouver/news/vancouver-voices )

Я в основном вызываю команду через bash, а затем отправляю команду grep awk или sed

Если я использую grep (| grep -o '".*": {'), Я могу приблизиться. Я получаю вывод, как:

"vancouver/news/vancouver-voices": {
"vancouver/news/vancouvers-march-second-annual-success": {

Я подозреваю, что мне нужно использовать sed или awk. Я пробовал несколько вещей, но я думаю, что мне нужно избежать некоторых специальных символов. Например, я пытался | awk '\"(.*)\": {' --output='$1 ', но это из-за обратной косой черты.

Может ли какой-нибудь гуру sed или awk подсказать мне, как правильно избегать специальных персонажей?

3 ответа3

2
awk '/{/ {print $2}' FS='"'

Результат

vancouver/news/vancouver-voices
vancouver/news/vancouvers-march-second-annual-success

Однако это было бы лучше сделать с помощью JQ

1

Решение с sed:

sed -n '/{/s="\([^"]*\)".*=\1=p'

grep + cut :

grep '{' | cut -d'"' -f2
0

Вы все еще можете использовать grep:

| grep -o '[^"/]\+\(/[^"/]\+\)\+'

выходы:

vancouver/news/vancouver-voices
vancouver/news/vancouvers-march-second-annual-success

Он ищет начальную строку, отличную от «, не / / символов», за которой следует одна или несколько последовательностей, состоящих из косой черты, за которой следует строка того же типа, что и исходная. Можно также использовать класс буквенно-цифровой-плюс-дефис для выбора компонентов URL.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .