我寫了一行代碼,查找並返回所需文件的完整路徑。輸出如下:操作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