echo "/dir1/dir2/filename.txt" | sed ????
将输出作为
的Sed表达式应该是什么 /dir1/filename.txt
如果还有其他更简单的方法可以实现这一点,那也是受欢迎的。
答案 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。