删除shell中的部分路径

时间:2013-04-25 09:49:36

标签: bash shell unix scripting sed

echo "/dir1/dir2/filename.txt" | sed ????

将输出作为

的Sed表达式应该是什么
   /dir1/filename.txt

如果还有其他更简单的方法可以实现这一点,那也是受欢迎的。

6 个答案:

答案 0 :(得分:2)

您可以使用cut

执行此操作
$ echo "/dir1/dir2/filename.txt" | cut -d/ -f1,2,4
/dir1/filename.txt

使用sed会有点乱:

$ echo "/dir1/dir2/filename.txt" | sed 's/^\(\/.*\)\(\/.*\)\(\/.*\)/\1\3/'
/dir1/filename.txt

我们的想法是使用/text获取部分\(\/.*\),然后使用\1\3打印我们想要的部分,1和3。

答案 1 :(得分:1)

这应该很好地处理awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/'

$ echo "/dir1/dir2/filename.txt" | awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/' 
/dir1/filename.txt

此处的优点是脚本与字段数无关,因此在给定任意数量的文件夹的情况下,文件始终会移动到父目录中。

$ echo "/a/b/c/d/e/f/filename.txt" | awk '{$(NF-1)=$NF;NF--}1' FS='/' OFS='/' 
/a/b/c/d/e/filename.txt

通过将倒数第二个字段$(NF-)设置为最后一个字段$NF并减少字段数NF--来工作。

答案 2 :(得分:0)

使用sed:

echo "/dir1/dir2/filename.txt" | sed 's:^\(.*\)/[^/]\+\(/[^/]\+\)$:\1\2:'

这将删除最后一个目录的名称。

答案 3 :(得分:0)

这可能对您有用:

echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/.*\(\/.*\)/\1\2/'

echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/[^/]*\//\1\//'

答案 4 :(得分:0)

 echo "/dir1/dir2/filename.txt" | sed 's/\/\w*//2'

答案 5 :(得分:0)

Sidharth C Nadhan说过这个     echo“/dir1/dir2/filename.txt”| sed's // \ w * // 2' 但要使其更具可读性,请使用'!' (或其他)。

$ echo "/dir1/dir2/filename.txt" | sed 's!/\w*/!/!'
/dir2/filename.txt

的!/ \ W * /!/!含义替换/ \ w * / with / \ w是单词characer,*表示任何数字。 '!'是一个分隔符。 我添加了这个,即使已经接受了解决方案, 但是我认为这是不那么丑陋,值得一看。

另外,如果这是用于bash脚本,bash也很擅长这个东西, 而且因为它是在bash中构建的,所以它在同一个过程中并且效率更高。

$ f="/dir1/dir2/filename.txt";  echo $f; echo ${f/dir2\//}
/dir1/dir2/filename.txt
/dir1/filename.txt

不幸的是你不能使用/以外的东西作为分隔符,我无法弄清楚如何制作\ w,或[^ /] *或[a-z0-9] *或其他任何工作。在这方面,Bash并不像sed那么好,我也不知道bash。