0

我写了一行代码来查找并返回所需文件的完整路径。输出如下:

/home/ke/Desktop/b/o/r/files.txt:am.torrent
/home/ke/Desktop/y/u/n/u/s/files.txt:asd.torrent

我必须像这样修改输出:

bor
yunus

我怎么做?

提前致谢。

4

4 回答 4

1

这应该适合你:

your_script.sh | sed 's,.*Desktop,,' | sed 's,[^/]*$,,' | sed s,/,,g

或者,甚至更好:

your_script.sh | sed 's,.*Desktop,,;s,[^/]*$,,;s,/,,g'
于 2013-05-03T17:48:52.917 回答
0

用 sed。echo '/home/ke/Desktop/b/o/r/files.txt:am.torrent' | sed -e 's+/++g' -e 's/^.*Desktop//' -e 's/files.txt:.*$//'. 这是一个相当简单的解决方案,我相信还有更好的解决方案。

于 2013-05-03T17:49:01.930 回答
0

我求助于 awk:

BEGIN { FS="/" }

{
  for(i=1;i<NF;i++)
    if (length($i) == 1)
      a[NR]=a[NR]""$i
}
END {
  for (i in a)
    print a[i]
}

像这样使用它:

$ awk -f script.awk input
bor
yunus

或者如果您将数据保存在变量中:

$ awk -f script.awk <<< $data
于 2013-05-03T17:56:13.377 回答
0

这不是一个很好/整洁的解决方案,但 bash 参数扩展是一个强大的工具。所以忍不住举个例子

[]l="/home/ke/Desktop/b/o/r/files.txt:am.torrent"
[]m=${l##*Desktop/}
[]n=${m%%/files.txt*}
[]k=${n//\//}
[]echo $m
b/o/r/files.txt:am.torrent
[]echo $n
b/o/r
[]echo $k
bor

您可以看到 bash 在不使用任何外部程序的情况下逐步替换变量的效果如何(顺便说一句[]是 PS1,提示符)还有很多方法可以做到这一点。我在写第一个时又得到了一个

[]l="/home/ke/Desktop/b/o/r/files.txt:am.torrent"
[]m=${l/*Desktop\//}
[]n=${m/\/files.txt*/}
[]k=${n//\//}
[]echo $m
b/o/r/files.txt:am.torrent
[]echo $n
b/o/r
[]echo $k
bor

多尝试一些,

于 2013-05-03T18:17:39.990 回答