sed строка и содержат значение в новой переменной

У меня есть эта Строка cap/media/101/101.mp4 и я должен сократить 101 в другой Переменной.

Я пытаюсь сделать это с sed но это не дает мне вывод, в котором я нуждаюсь.

echo cap/media/101/101.mp4 | sed -e 's/d/\(.*\)/\1/'

кто-то может дать общее представление об этом?

0
задан 19 May 2017 в 05:04

3 ответа

Принятие Вас хочет символы между media/ и следующее / (на основе того, что Вы сказали в комментариях) Вы могли сократить ту часть с

sed -r 's|.*media/([^/]+).*|\1|'

Объяснение

  • -r используйте ДО (таким образом, мы не должны выходить () или + использовать их в качестве метасимволов
  • s|old|new| замена old с new (использование альтернативного разделителя, чтобы избежать необходимости выходить / в строке)
  • ([^/]+) сохраните некоторые символы, которые не являются /
  • \1 сохраненный шаблон (остальное отбрасывается),
1
ответ дан 7 November 2019 в 00:38

Принимая последовательные поля, простая команда awk может добиться цели:

echo cap/media/101/101.mp4 | awk -F"/" '{print $3}'

Вывод:

101
2
ответ дан 7 November 2019 в 00:38

(Поздно стороне :)). Столько способов освежевать эту кошку... Вот некоторые:

Здесь, я окружал цифры /:

С cut:

cut -d/ -f3 

С grep:

grep -Po '/\K\d+(?=/)'

С perl:

perl -F/ -lane 'print $F[2]'

С python:

python3 -c 'import sys; i=sys.stdin.read().split("/"); print(i[2])'

Другой sed:

sed -E 's#.*/([0-9]+)/.*#\1#' 

Другой awk (хотя уже обеспеченный awk ответ, добирающийся / разграниченное 3-е поле должно быть способом пойти):

awk '{i=gensub(".*/([0-9]+)/.*", "\\1", "g"); print i}'

С go:

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := "cap/media/101/101.mp4"
    fmt.Println(strings.Split(str, "/")[2])
}

Пример:

% cut -d/ -f3 <<<'cap/media/101/101.mp4'                                                          
101

% grep -Po '/\K\d+(?=/)' <<<'cap/media/101/101.mp4'
101

% perl -F/ -lane 'print $F[2]' <<<'cap/media/101/101.mp4'                                         
101

% python3 -c 'import sys; i=sys.stdin.read().split("/"); print(i[2])' <<<'cap/media/101/101.mp4'
101

% sed -E 's#.*/([0-9]+)/.*#\1#' <<<'cap/media/101/101.mp4'
101

% awk '{i=gensub(".*/([0-9]+)/.*", "\\1", "g"); print i}' <<<'cap/media/101/101.mp4'
101

## Go Playground: https://play.golang.org/p/kGdzyywEB2
1
ответ дан 7 November 2019 в 00:38

Другие вопросы по тегам:

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