sed 字符串并将值保存在新变量中

sed 字符串并将值保存在新变量中

我有这个字符串cap/media/101/101.mp4,我需要将其剪切101到另一个变量中。

我正在尝试这样做,sed但它并没有给我我需要的输出。

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

有人可以给出关于此的想法吗?

答案1

假设字段一致,一个简单的 awk 命令就可以解决问题:

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

输出:

101

答案2

media/假设你想要介于和下一个之间的字符/(基于你在评论中所说的),你可以用

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

解释

  • -r使用 ERE(这样我们就不必转义()+将它们用作元字符
  • s|old|new|替换oldnew(使用替代分隔符以避免/在字符串中转义)
  • ([^/]+)保存一些不存在的字符/
  • \1已保存的模式(其余的被丢弃)

答案3

(迟到了 :))。有很多方法可以解决这一问题……以下是其中一些:

在这里,我得到了被包围的数字/

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答案获取/分隔的第三个字段应该是可行的方法):

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

相关内容