如何制作正则表达式以匹配文件路径?

3 regex bash grep

我已经玩这个命令大约一两个小时了,恐怕我已经失去了客观性。目标是仅匹配提供给 bash 的相对文件路径。

第一个相对路径../some/file/path

第二个相对路径是..../some/file/path

其中“/some/file/path”的长度是任意的。

我一直在使用grepinsidebash尝试弄清楚如何在我的脚本中实现它,以便我可以将它扩展到它的绝对文件路径,以便./some/file/path../some/file/path变为/the/absolute/file/path; 我已经弄清楚了。

我的问题是匹配相对路径。

我一直在使用的代码是

echo "../some/file/path" | egrep '\.{1}/?[[:graph:]]?+$'
Run Code Online (Sandbox Code Playgroud)

echo "../some/file/path" | egrep '\.{2}/?[[:graph:]]?+$'
Run Code Online (Sandbox Code Playgroud)

我已经将我的问题缩小到

echo ".." | egrep '\.{2}'
Run Code Online (Sandbox Code Playgroud)

只要它2 + n出现,就会匹配点,而不是像预期的那样准确地出现 2 次。当我将其更改为

echo ".." | egrep '\.{1}' 
Run Code Online (Sandbox Code Playgroud)

由于某种原因我无法弄清楚,它仍然会匹配。

最终的实现应该是这样的

 41 _expand_relative_path () {
 42         if [[ "$1" =~ ^\.{1}/?[[:graph:]]?+$ ]]; then
 43                 echo "."
 44         elif [[ "$1" =~ ^\.{2}/?[[:graph:]]?+$ ]]; then
 45                 echo ".."
 46         else    
 47                 echo "$1"
 48         fi
 49 }
Run Code Online (Sandbox Code Playgroud)

根据我的教科书,如果前面的元素恰好出现 n 次,说明符 {n} 将匹配它。但它不会那样做!如果是 n 次或更多次,则匹配!我究竟做错了什么?

Boh*_*ian 5

匹配相对路径的正则表达式不以斜杠开头:

^[^/].*
Run Code Online (Sandbox Code Playgroud)