2013-05-03 77 views
0

我写了一行代码,查找并返回所需文件的完整路径。输出如下:操作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 

我该怎么办呢?

在此先感谢。

回答

1

这应该为你工作:

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

,或者甚至更好:

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

三个实例?你不觉得这太过分了吗? – 2013-05-03 17:49:50

+0

不,我不认为这是一个矫枉过正的问题,它会工作的很快。但是,是的,它也可以在sed的一次调用中完成。 – piokuc 2013-05-03 17:52:41

+1

您可以通过用';'分隔命令在单个实例中运行多个sed命令,如下所示:'sed -e's,。* Desktop ,,; S,[^ /] * $ ,,; s,/ ,, g'' – 2013-05-03 18:10:57

0

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

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 
+0

但是如果输入行是'/home/q/Desktop/b/o/r/files.txt:am.torrent'呢? – 2013-05-03 18:03:45

+0

好吧,是的,这是一个问题,因为你会得到'qbor',但是这种格式没有在OPs tetstdata中给出。我会等待一个完整的通用解决方案,直到OP请求这样的... – 2013-05-03 18:10:05

+1

但这种可能性是隐含的。 '/ home/ke/Desktop'暗示他正在扫描用户homedirs。这是不正常的,但没有什么禁止单字符用户名。 – 2013-05-03 18:13:12

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 

尽量多一些,sed的

+0

对不起原来的问题,你可以逐行阅读一段时间来使用这个 – abasu 2013-05-03 18:20:05