2014-11-02 128 views
0

我有這樣的文字解析文本

hello [email protected]@/dev/[email protected]/helloworld.out 
hello world with [email protected]@/dev/[email protected]/helloworld.out 
echo [email protected]@inout/[email protected]/echo.out 
echo [email protected]@inout/[email protected]/helloworld.out 
memleaks [email protected]@inout/[email protected]/memleaks.6.out 
memleaks [email protected]@inout/[email protected]/memleaks.11.out 

我想運行一個bash循環,在每一輪我會讀一行,並會得到4瓦爾每個 直到在@(不帶@) 要知道我是什麼行號 我走到這一步,

((index=0)) 
for read line 
do 
    ((index+=1)) 
    var1= 
    var2= 
    var3= 
    var4= 
done 

我想要得到的是

var1=hello world 
var2=helloworld 
var3=/dev/zero 
var4=inout/helloworld.out 

,有沒有辦法做到1行?

+0

您可以編輯顯示在VAR1您的預計產量,VAR2等 – Hackaholic 2014-11-02 19:03:02

+0

是你說得對,我加入這 – JohnnyF 2014-11-02 19:06:59

+0

的http://計算器。 com/questions/918886/how-do-i-split-a-string-on-a-delimiter-in-bash – stark 2014-11-02 19:22:05

回答

1

Bash(顯然)具有文件讀取和令牌拆分構建。要拆分自定義分隔符,請將IFS設置爲合適的值。

oldIFS=$IFS 
[email protected] 
while read -r var1 var2 var3 var4; do 
    : stuff 
done <file 

您需要oldIFS如果有什麼在腳本其他依賴於常規空格solitting行爲。一個常見的安排是將的值分解爲local值。

-r選項read指定了健全的行爲,應該是默認的,但不能出於傳統原因。沒有這個選項的行爲是合理的,如果你解析實際的shell代碼,但通常不是。

+0

我該如何使用它?那麼我把什麼放在「<文件」? – JohnnyF 2014-11-02 21:17:11

+0

爲什麼你需要'oldIFS'? 'IFS = @ read -r ...'有什麼問題? – 2014-11-02 21:53:51

0

您也可以在awk中使用-F標誌來指定字段分隔符(相當於$IFS)。

例如,轉儲等領域中的每一行:

while read line ; do 
    echo $line | awk -F '@' '{ print $1,$2,$3,$4 }' 
done