2013-05-03 74 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