我想从给定的绝对路径生成相对路径,并将其存储在变量中。
/aaa/bbb/ccc/ddd/eee.txt
应该生成../../../..
,我可以根据需要将其附加到其他路径。
$filepath=/aaa/bbb/ccc/ddd/eee.txt
我想创建一个名为$abs
的新变量,其中应包含../../../..
。
尝试过:
echo "$filepath" | sed -r 's/*/../g'
上述模板无法按要求工作。
作为一个新手,我可能会问一个愚蠢的问题。
请原谅,谢谢!
答案 0 :(得分:1)
我不确定sed是否可以执行此操作,但是可以显示执行该操作的awk命令。
import matlotlib.pyplot as plt
def graph_plotting(dates_temperatures): #setting graph
fig, ax = plt.subplots()
ax.plot(dates_temperatures.keys(), dates_temperatures.values())
ax.set_title('Weather Forecast')
ax.legend(loc='upper left')
ax.set_ylabel('Temperature')
ax.set_xlim(
xmin=list(dates_temperatures.keys())[0],
xmax=list(dates_temperatures.keys())[-1]
)
ax.yaxis.tick_right()
其中
echo "$filepath" | awk -F'/' '{ for ( i = 2; i < NF-1; i++ ) printf "../" } END{print ".."}'
是字段分隔符
将文本-F '/'
分成6个部分,每个部分都可以用作awk中的变量,在这种情况下,这也会导致它从文本中删除字段分隔符/aaa/bbb/ccc/ddd/eee.txt
。
/
首先是$1
为空/之前没有任何内容。''
是$2
aaa
是$3
bbb
是$4
ccc
是$5
ddd
是$6
eee.txt
变量包含我们有多少个字段。
NF
用于循环
我从2开始而不是1,因为第一个字段始终为空,导致绝对路径始终以for ( i = 2; i < NF-1; i++ )
开头,这将忽略该字段。
我还减去了/
作为最后一个字段的NF
变量,它将包含文件名,因此它不是目录,但是如果它是目录并且有目录,则会出现问题没有1
的结尾,就像/
一样,您将以/home/jondoe
而不是..
结尾,而../..
将起作用。
/home/jondoe/
在每个循环中都紧挨着打印。
printf "../"
将打印END{print ".."}
,无论输入内容如何。这将导致文本末尾出现..,而对于循环,则仅重复打印..
仍然可以改进此命令以消除陷阱,就像我提到的那样。 我希望这适合您的需求。
答案 1 :(得分:1)
您可以避免与其他字符(例如#
)转义斜线。
首先,使用“ $ {filepath%/ *}”(比basename
更好)从路径中切断文件名。
您用至少一个字符用点替换每个字符串。
最后删除开始的斜杠。
echo "${filepath%/*}"| sed 's#[^/]\+#...#g;s#\/##'