我写了一行代码,查找并返回所需文件的完整路径。输出如下:操作bash shell中的输出字符串
/home/ke/Desktop/b/o/r/files.txt:am.torrent
/home/ke/Desktop/y/u/n/u/s/files.txt:asd.torrent
我要修改这样的输出:
bor
yunus
我该怎么办呢?
在此先感谢。
我写了一行代码,查找并返回所需文件的完整路径。输出如下:操作bash shell中的输出字符串
/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
但是如果输入行是'/home/q/Desktop/b/o/r/files.txt:am.torrent'呢? – 2013-05-03 18:03:45
好吧,是的,这是一个问题,因为你会得到'qbor',但是这种格式没有在OPs tetstdata中给出。我会等待一个完整的通用解决方案,直到OP请求这样的... – 2013-05-03 18:10:05
但这种可能性是隐含的。 '/ home/ke/Desktop'暗示他正在扫描用户homedirs。这是不正常的,但没有什么禁止单字符用户名。 – 2013-05-03 18:13:12
这不是一个很好的/整洁的解决方案,但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
尽量多一些,sed的
对不起原来的问题,你可以逐行阅读一段时间来使用这个 – abasu 2013-05-03 18:20:05
三个实例?你不觉得这太过分了吗? – 2013-05-03 17:49:50
不,我不认为这是一个矫枉过正的问题,它会工作的很快。但是,是的,它也可以在sed的一次调用中完成。 – piokuc 2013-05-03 17:52:41
您可以通过用';'分隔命令在单个实例中运行多个sed命令,如下所示:'sed -e's,。* Desktop ,,; S,[^ /] * $ ,,; s,/ ,, g'' – 2013-05-03 18:10:57