我写了一行代码来查找并返回所需文件的完整路径。输出如下:
/home/ke/Desktop/b/o/r/files.txt:am.torrent
/home/ke/Desktop/y/u/n/u/s/files.txt:asd.torrent
我必须像这样修改输出:
bor
yunus
我怎么做?
提前致谢。
这应该适合你:
your_script.sh | sed 's,.*Desktop,,' | sed 's,[^/]*$,,' | sed s,/,,g
或者,甚至更好:
your_script.sh | sed 's,.*Desktop,,;s,[^/]*$,,;s,/,,g'
用 sed。echo '/home/ke/Desktop/b/o/r/files.txt:am.torrent' | sed -e 's+/++g' -e 's/^.*Desktop//' -e 's/files.txt:.*$//'
. 这是一个相当简单的解决方案,我相信还有更好的解决方案。
我求助于 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
这不是一个很好/整洁的解决方案,但 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
多尝试一些,