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

获得输出的 Sed 表达式应该是什么

   /dir1/filename.txt

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

4

6 回答 6

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

这个想法是获取部分/textwith\(\/.*\)然后打印我们想要的部分,1 和 3,with \1\3

于 2013-04-25T09:54:27.507 回答
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--

于 2013-04-25T10:10:42.747 回答
0

这可能对您有用:

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

或者

echo "/dir1/dir2/filename.txt" | sed 's/\(.*\)\/[^/]*\//\1\//'
于 2013-04-25T10:04:31.547 回答
0

使用 sed:

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

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

于 2013-04-25T10:02:15.900 回答
0
 echo "/dir1/dir2/filename.txt" | sed 's/\/\w*//2'
于 2013-04-25T10:06:17.650 回答
0

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 的了解也不如我应该的那样。

于 2013-04-25T20:39:25.807 回答