在ksh脚本的路径中替换目录名称

时间:2019-05-06 18:12:49

标签: string scripting ksh

我想从给定的绝对路径生成相对路径,并将其存储在变量中。

/aaa/bbb/ccc/ddd/eee.txt应该生成../../../..,我可以根据需要将其附加到其他路径。

$filepath=/aaa/bbb/ccc/ddd/eee.txt

我想创建一个名为$abs的新变量,其中应包含../../../..

尝试过:

echo "$filepath" | sed -r 's/*/../g'

上述模板无法按要求工作。

作为一个新手,我可能会问一个愚蠢的问题。

请原谅,谢谢!

2 个答案:

答案 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#\/##'