我有一个字符串,正好是一个文件路径
/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt
,
我需要提取其文件夹的路径,
要得到/Users/dengjiangzhou/Documents/源码/198/
。
这是我尝试过的。
echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed 's@.*\(/.+\)@\1@p'
/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt
我使用正则表达式捕获组,尝试捕获第一组/李宏毅-机器学习2017秋季.txt
,并将其替换为,
似乎正则表达式捕获组具有从末尾到开头匹配的效果。
那么我会得到
/Users/dengjiangzhou/Documents/源码/198
我读过了Sed 正则表达式,在 Mac 终端中提取字符串的一部分一次又一次。
希望得到帮助,朋友
非常想得到/Users/dengjiangzhou/Documents/源码/198/
,
/Users/dengjiangzhou/Documents/源码/198
不好。
有什么好主意吗?
答案1
+
第一次尝试没有成功,因为缺少转义符
echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed 's@.*\(/.\+\)@\1@'
/李宏毅-机器学习2017秋季.txt
(对于扩展 RE,可以使用-r
或选项来避免元字符的转义)。-E
您想要的是 dirname 部分,然后只需将 ER 的第一部分分组。
echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed 's@\(.*\)/.*@\1@'
/Users/dengjiangzhou/Documents/源码/198
中的量词sed
是贪婪的,这意味着当你要求匹配像这样的正则表达式时.*/.*
,第一个.*
将匹配全部行直到最后,因为你要求匹配.
任意数字中的任何内容*
,并且 a/
是任意数字中的任何内容。
编辑-如果你想阅读有关正则表达式和 sed 的内容,请看一看 https://www.regular-expressions.info/tutorial.html http://www.grymoire.com/Unix/Sed.html#uh-0
答案2
dirname "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt"