我已经玩这个命令大约一两个小时了,恐怕我已经失去了客观性。目标是仅匹配提供给 bash 的相对文件路径。
第一个相对路径.
或./some/file/path
第二个相对路径是..
或../some/file/path
其中“/some/file/path”的长度是任意的。
我一直在使用grep
insidebash
尝试弄清楚如何在我的脚本中实现它,以便我可以将它扩展到它的绝对文件路径,以便./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 次或更多次,则匹配!我究竟做错了什么?