2015-05-04 65 views
1

我在bash腳本中逐行讀取文本文件中的文件名。然而,該行是這樣的:bash中特殊字符的分割字符串

/path/to/myfile1.txt 1 
/path/to/myfile2.txt 2 
/path/to/myfile3.txt 3 

...

/path/to/myfile20.txt 20 

因此,有含空間speparated的整數第二列。我只需要空間之前的部分字符串。 我發現只有使用「for-loop」的解決方案。但是我需要一個函數,在我的字符串中顯式查找「」--character(空格),並在那個點上分割它。

原則上,我需要相當於Matlabs 「strsplit(STR,分隔符)」

+1

搜索關於'awk'命令。 – FalconUA

+3

'echo「$ string」|切-d''-f1'就足夠了。但是,如果您分享閱讀文件的整體方法,我們可能會提供更清潔的東西。 – fedorqui

+0

我從來不懂awk命令。同樣,使用「echo」的解決方案也沒有用,因爲我需要將字符串的「剪切版本」分配給新變量。 – mcExchange

回答

1

如果您需要遍歷線槽文件的每一行反正,你可以切斷後面的空間都與bash

while read -r line ; do 
    # bash string manipulation removes the space at the end 
    # and everything which follows it 
    echo ${line// *} 
done < file 
2

三種解決方案(許多):

# Using awk 
echo "$string" | awk '{ print $1 }' 
# Using cut 
echo "$string" | cut -d' ' -f1 
# Using sed 
echo "$string" | sed 's/\s.*$//g' 
+0

注意它們並不完全等價:'cut -d'''將會粘在一個空格上。如果你想讓它適應多個空間,你首先需要用'tr -s'''擠壓它們。 – fedorqui

+0

你說得對。然而作者說「空間」和「空間性格」,因此我認爲這只是一個空間。有解決這個問題的辦法,並不總是等同的解決辦法。 – GHugo

+0

我想我不能使用「回聲」命令。該字符串不是硬編碼的,而是來自一個字符串列表,並且必須分配給一個變量,稍後我將在腳本中使用該變量。所以我需要將字符串的「剪切版本」分配給一個新的變量。我會怎麼做,在一個bashscript? – mcExchange

3

如果您已經閱讀的東西的文件中像

while read -r line; do 

(和you should be),然後傳遞參數read代替:

while read -r filename somenumber; do 

read將分裂上的空白行和第一場到filename和任何剩餘的字段(多個)分配給somenumber

+0

當字符串列後有多個數字列時,這會變得越來越緊張... – mcExchange

+0

你關心數字嗎?如果一行看起來像'/path/to/file1.txt 3 4 5 6',那麼'filename'將被設置爲'/ path/to/file1.txt','somenumber'將被設置爲'3 4 5 6'。輸入僅被分割爲必要的字段以將參數填充到'read'。 – chepner

+0

啊,好的。那麼它確實有用 – mcExchange

0
while read -r line 
do 
    { rev | cut -d' ' -f2- | rev >> result.txt; } <<< $line 
done < input.txt 

該解決方案將工作,即使你有空間在你的文件名。

1

這應該工作太:

line="${line% *}" 

這減少了串,這是最後一次出現(左起)的空間。所以即使路徑包含空格(只要它在後面有一個空格),它也可以工作。