我有这个字符串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|
替换old
为new
(使用替代分隔符以避免/
在字符串中转义)([^/]+)
保存一些不存在的字符/
\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