![](/img/trans.png)
[英]Create/find batch script which performs a 'find and replace' within a directory and sub-directories, for excel files with varied names
[英]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
是''
空的,因为第一/前没有什么。 $2
是aaa
$3
是bbb
$4
是ccc
$5
是ddd
$6
是eee.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.