繁体   English   中英

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

[英]Replace directory names in a path in ksh script

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

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

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

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

试过这个:

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

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

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

请原谅和感谢!

我不确定sed是否可以执行此操作,但是可以显示执行该操作的awk命令。

echo "$filepath" | awk -F'/' '{ for ( i = 2; i < NF-1; i++ ) printf "../" } END{print ".."}'

其中-F '/'是字段分隔符,将文本/aaa/bbb/ccc/ddd/eee.txt分为6个部分,每个部分都可以用作awk中的变量,这也会导致它删除字段分隔符/在这种情况下,来自文本。

  • $1''空的,因为第一/前没有什么。
  • $2aaa
  • $3bbb
  • $4ccc
  • $5ddd
  • $6eee.txt

NF变量包含我们有多少个字段。


for ( i = 2; i < NF-1; i++ )是周期

我从2开始而不是1,因为第一个字段始终为空,导致绝对路径始终以/开头,这将忽略该字段。

我还将最后一个字段减去NF变量并加上1作为最后一个字段,它将包含文件名,因此它不是目录,但是如果它是目录并且在末尾没有/之类的/home/jondoe ,则这会发生问题/home/jondoe将以..而不是../..结尾,而/home/jondoe/可以使用。

只要循环结束, printf "../"就会在每个循环中紧挨着打印。

END{print ".."}将打印..不管输入内容如何。 这将导致..在文本末尾,而对于循环,仅重复打印../


就像我提到的那样,仍然可以改进此命令以消除陷阱。 我希望这适合您的需求。

您可以避免使用#等其他字符来转义斜线。
首先,使用“ $ {filepath%/ *}”(比basename更好)从路径中切断文件名。
您用至少一个字符用点替换每个字符串。
最后删除开始的斜杠。

echo "${filepath%/*}"| sed 's#[^/]\+#...#g;s#\/##'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM