2011-06-16 61 views
2

在一些腳本,它讀取目錄名和得到的東西像閱讀目錄名稱的一部分,擺脫回車控制usind sed的或類似的

66.9090_89.4450_168.0250_ABC3/ 

我需要提取物「ABC3」所以我嘗試

sed -i -e "s/_/ /g" temp_direc 

,所以我得到

66.9090 89.4450 168.0250 ABC3/ 

然後

read LABEL <<< $(awk '{print $4}' temp_direc) 

,現在我得到

ABC3/ 

,但我不知道如何刪除最後的「/」。此外,我以後需要做

echo $A" "$LABEL 

是$ A一些字符串如45.56

,我想輸出是

45.56 ABC3 

但我真的得到

ABC3/6 

所以它似乎在某種程度上嵌入在那裏的馬車控制字符。我怎麼能擺脫這一點,並得到我想要的輸出?

回答

2

嘗試simplier:

echo '66.9090_89.4450_168.0250_ABC3/' | cut -d"_" -f4 | cut -d"/" -f1 

這將產生ABC3

+0

它看起來不錯,但是當我這樣做時;回聲「45」$ var,其中$ var是用你的解決方案獲得的,我得到了; ABC3 45 – flow 2011-06-16 17:25:06

+0

奇怪......你可以試着'echo''$ var'「'看看除了ABC3之外是否還有什麼特別的東西被打印出來?你也可以嘗試'echo'45 $ var「' – pajton 2011-06-16 21:03:35

1

不是100%肯定,你在這裏後在做什麼。但要獲得ABC3你有90%的它已經:

$echo '66.9090_89.4450_168.0250_ABC3/' | awk -F'_' '{print $4;}' | sed 's/\///' 
ABC3 
3

sed的解決辦法是:

sed 's#.*_\([^_/]*\)\(/\|$\)#\1#' 

RESP。與GNU sed

sed -r 's#.*_([^_/]*)(/|$)#\1#' 

我選擇了#作爲分隔符(而不是通常的/),因爲有一個在其中,否則就必須躲過模式的/

1

一個AWK唯一的解決辦法:

read LABEL <<< $(echo '66.9090_89.4450_168.0250_ABC3/' \ 
        | awk -F '[_/]' '{printf("%s", $4);}') 

OPSS ......我認爲該字段是有史以來第四,以下行並沒有此限制:

read LABEL <<< $(echo '66.9090_89.4450_168.0250_ABC3/' \ 
        | awk -F '[_/]' '{printf("%s", $(NF -1));}') ; echo $LABEL 
1

要獲得輸出像ABC3/6表示您的$A以回車結束。您可以在輸入文件中使用類似dos2unix,或使用tr來刪除回車:

A=$'45.56\r' 
B="66.9090_89.4450_168.0250_ABC3/" 

a=$(echo "$A" | tr -d $'\r') # remove all carriage returns 

b=${B##*_} # remove up to (and including) the last underscore 
b=${b%/}  # remove a trailing slash 

echo "$a $b" # ==> "45.56 ABC3" 
+0

關於'\ r'的好處。 ;)爲bash +1 – jm666 2011-06-16 20:58:15

1

呼應'66 .9090_89.4450_168.0250_ABC3 /」 | sed -e's /^.*_//'-e's /.$//'