2012-03-05 58 views
0

我正在使用cygwin on Windows 7。我想遍歷由大約10,000個文件組成的文件夾,並對每個文件執行信號處理工具的操作。問題是文件名稱有一些與操作不兼容的多餘字符。因此,我需要提取文件名的某個部分。在Unix中提取子字符串

例如,如果文件名是abc123456_justlike.txt.rna我需要使用abc123456_justlike.txt。我應該如何編寫一個循環來遍歷每個文件並對縮短的文件名執行操作?

我試過cut - b1-10命令,但這並不讓我的工具執行必要的操作。我很感激幫助解決這個問題

+0

這個問題也許應該移到http://unix.stackexchange.com/ :) – 2012-03-05 20:12:36

+2

@ PaoloMoretti強烈反對。僅僅因爲你正在使用'cut','sed','awk'或'perl'等shell工具,並不意味着它不是一個編程問題。它絕對是這樣的。 – tchrist 2012-03-05 20:14:10

回答

2

嘗試一些外殼腳本,使用$ {NAME%TAIL}參數替換:變量名的內容被擴大,但其TAIL glob模式匹配任何後綴材料被切掉。

$ NAME=abc12345.txt.rna 
$ echo ${NAME%.rna} # 

# process all files in the directory, taking off their .rna suffix 
$ for x in *; do signal_processing_tool ${x%.rna} ; done 

如果在文件名中的變化,可以用他們的情況進行分類:

for x in * ; do 
    case $x in 
    *.rna) 
     # do something with .rna files 
     ;; 
    *.txt) 
     # do something else with .txt files 
     ;; 
    *) 
     # default catch-all-else case 
     ;; 
    esac 
done 
+0

我喜歡你提出的第一個解決方案。這裏是我更新的問題:http://stackoverflow.com/questions/9573953/filename-manipulation-in-cygwin – dawnoflife 2012-03-05 21:16:39

2

嘗試sed

echo a.b.c | sed 's/\.[^.]*$//' 

seds命令執行搜索和替換操作,在這種情況下,它取代了正則表達式\.[^.]*$(意爲:點,隨後是任何數量的非點,在字符串的末尾)與空字符串。

如果你還不熟悉正則表達式,這是學習它們的好點。我發現使用正則表達式操作字符串要比使用像cut(或其等價物)這樣的工具更直接。

+0

你爲什麼要逃避方括號內的角色類中的點?這是不需要的;它有不同的規則。順便說一句,如果你更喜歡Perl的發燒友正則表達式,你可以簡單地說'perl -pe'/'。[^.]*$//''作爲等價物,儘管在這種情況下它沒有區別。隨着更奇特的模式,使用BRE的'sed'語法有點冗長。 – tchrist 2012-03-05 20:11:36

+0

謝謝,編輯。我不喜歡Perl,但我寧願不要在這裏開始一場火焰戰爭:-)正則表達式的基本知識在大多數正則表達式方言中幾乎是相同的。還有'sed -r'。 – krlmlr 2012-03-05 20:14:14

+0

事情是'sed'在默認情況下,按照標準,使用**基本正則表達式**,其中您必須使用反斜槓轉義諸如'\('或'\''或'\ +'來獲取它們如果你的'-E'標誌爲GNU'sed',那麼它將切換到Perl使用的** Extended Regular Expressions **,但Perl更具可移植性,因爲它沒有版本理解EREs;唉用'sed',有。 – tchrist 2012-03-05 20:16:46

0

如果您嘗試從目錄中提取文件名列表,請使用以下命令。

ls -ltr | awk -F " " '{print $9}' | cut -c1-10