echo "/dir1/dir2/filename.txt" | sed ????
获得输出的 Sed 表达式应该是什么
/dir1/filename.txt
如果有任何其他更简单的方法来实现这一点,那也是受欢迎的。
你可以这样做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
with\(\/.*\)
然后打印我们想要的部分,1 和 3,with \1\3
。
这应该可以很好地解决问题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--
。
这可能对您有用:
echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/.*\(\/.*\)/\1\2/'
或者
echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/[^/]*\//\1\//'
使用 sed:
echo "/dir1/dir2/filename.txt" | sed 's:^\(.*\)/[^/]\+\(/[^/]\+\)$:\1\2:'
这将删除最后一个目录的名称。
echo "/dir1/dir2/filename.txt" | sed 's/\/\w*//2'
Sidharth C Nadhan 说这个 echo "/dir1/dir2/filename.txt" | sed 's//\w*//2' 但为了使其更具可读性,请使用 '!' (或者是其他东西)。
$ echo "/dir1/dir2/filename.txt" | sed 's!/\w*/!/!'
/dir2/filename.txt
's!/\w*/!/!' 含义 将 /\w*/ 替换为 / \w 是一个单词字符,* 表示任何数字。'!' 是分隔符。即使解决方案已经被接受,我也添加了这个,但我认为这不那么难看,值得一看。
此外,如果这是用于 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 的了解也不如我应该的那样。