大佬们,这个Shell怎么写,一行命令写出来,可以用sed

大佬们,这个Shell怎么写,一行命令写出来,可以用sed
1
convert https://www.baidu.com/aaa/bbb/ccc/xxx.zip to www-baidu-com-aaa-bbb-ccc-xxx

要兼容 schema 是 http 的情况,即

也要把 http://www.baidu.com/aaa/bbb/ccc/xxx.zip 转化成 www-baidu-com-aaa-bbb-ccc-xxx
2
sed 对正则表达式的支持不全,尝试了几十分钟都没有写对,求助大佬们。
3
好难~
4
@iks 一样什么都想用正则搞
5
  1. echo "https://www.baidu.com/aaa/bbb/ccc/xxx.iso" | awk -F"//" '{print $2}' | sed  "s/\//-/g" | sed "s/\./-/g"
复制代码


这样写出来了,但这样实现与我的初衷有点违背,我希望一次 sed 就能拿到值
6
fg9907 发表于 2022-9-21 21:12
这样写出来了,但这样实现与我的初衷有点违背,我希望一次 sed 就能拿到值

...

强迫症吗
7
Bai. 发表于 2022-9-21 21:17
强迫症吗

好吧  😭
8
  1. $ echo "https://www.baidu.com/aaa/bbb/ccc/xxx.zip" | awk -F"//" '{print $2}' | sed  "s/\//-/g" | sed "s/\./-/g" | sed "s/.zip//g"
  2. www-baidu-com-aaa-bbb-ccc-xxx
复制代码
9
fg9907 发表于 2022-9-21 21:21
好吧

echo "https://www.baidu.com/aaa/bbb/ccc/xxx.iso" | sed -e "s/https:\/\///g" -e "s/\//-/g" -e "s/\./-/g"
使用-e 匹配多个条件
10
要啥sed,Shell内置功能就可以
  1. parse () { : "${1#*://}"; : "${_////-}"; : "${_//./-}"; echo "${_%-*}"; }
复制代码
  1. $ parse 'http://www.baidu.com/aaa/bbb/ccc/xxx.zip'
  2. www-baidu-com-aaa-bbb-ccc-xxx
  3. $ parse 'https://www.baidu.com/aaa/bbb/ccc/xxx.zip'
  4. www-baidu-com-aaa-bbb-ccc-xxx
复制代码
11
Bai. 发表于 2022-9-21 21:23
echo "https://www.baidu.com/aaa/bbb/ccc/xxx.iso" | sed -e "s/https:\/\///g" -e "s/\//-/g" -e "s/\. ...

感谢,学习了!
12
HOH 发表于 2022-9-21 21:08
跟@iks 一样什么都想用正则搞

你懂什么,我用正则替换你家的丧葬费发票
13
Origami 发表于 2022-9-21 21:24
要啥sed,Shell内置功能就可以

大佬,牛!学习一下,十分感谢
14
Origami 发表于 2022-9-21 21:24
要啥sed,Shell内置功能就可以

大神这是啥用法?
15
ggeeii 发表于 2022-9-21 21:42
大神这是啥用法?

https://github.com/A-BenMao/pure-bash-bible-zh_CN
16
技术贴帮顶
17
fg9907 发表于 2022-9-21 20:54
sed 对正则表达式的支持不全,尝试了几十分钟都没有写对,求助大佬们。

不是不全,是你格式没用对。😁
18
caizi 发表于 2022-9-21 22:01
不是不全,是你格式没用对。

那有可能,有些字符是否需要转义可能搞错了
19
Bai. 发表于 2022-9-21 21:23
echo "https://www.baidu.com/aaa/bbb/ccc/xxx.iso" | sed -e "s/https:\/\///g" -e "s/\//-/g" -e "s/\. ...

若要兼容 http:// 这怎么写好呢?
20
fg9907 发表于 2022-9-21 22:13
若要兼容 http:// 这怎么写好呢?

再加个 -e 或者通配符
主要这个方便修改 一眼就能明白
21
Bai. 发表于 2022-9-21 22:18
再加个 -e 或者通配符
主要这个方便修改 一眼就能明白

哦哦 确实是

-e "s/http:\/\///g"

如果没有匹配到 http:// 那么就不会替换什么,谢谢指导
22
正则