2017-08-07 55 views
0

我有一個字符串(用逗號分隔)從中我需要提取的第一個字符'如何從Shell中的字符串中提取第一個字符?

Eg 'A - one,B - two,C - three' 

預計輸出

A,B,C 
+3

什麼你親自嘗試一下?你是否要求代碼沒有顯示任何研究工作? – Inian

+1

你會認爲沒有任何事情會問一個問題嗎?我不是UNIX的新手,但我並不是主人,儘管 –

+1

並不意味着無論如何都不尊重,但社區堅持在發佈問題之前發佈研究成果,而不是_blatantly_要求提供代碼。 – Inian

回答

1
echo 'A - one,B - two,C - three' | awk -F ',' '{OFS = ","} {for(i=1;i<=NF; i++) {$i=substr($i,1,1) }; print $0}' 
1

在大多數情況下,這應該工作(ASCII )

echo 'A - one,B - two,C - three' | tr ',' '\n' | cut -b1 

對於基於字符的選擇(例如utf),這個更適合

echo 'A - one,B - two,C - three' | tr ',' '\n' | cut -c1 
+0

如果在第一個字符之後沒有空格,這將不起作用。 – MichalH

+0

現在應該修復 – mko

+0

由於不是所有字符的長度均爲1個字節(例如UTF8),所以'cut -c1'會更好。 – MichalH

0

SED解決方案:

echo 'A - one,B - two,C - three' | sed 's/\(.\)[^,]*,\{0,1\}/\1,/g;s/,$//' 
+0

如果你不介意,你可以向我解釋'sed'表達 –

+0

@SathishKumar當然。括號中的圓點是您的第一個字符'\(。\)',那麼就會有一些非逗號字符'[^,] *'和一個可選的逗號'\ {0,1 \}',因爲最後一部分後面沒有逗號。你只用第一個字符和一個逗號代替這個每個部分,所以你有:第一個字符逗號第一個字符逗號等等,然後你用第二個替換's /,$ //'去掉最後一個逗號。而已。 – MichalH

+0

感謝您的解釋 –

0

sed的一行程序應該爲您例如工作:

sed -r 's/\s-[^,]*//g 

測試:

kent$ sed -r 's/\s-[^,]*//g'<<< 'A - one,B - two,C - three' 
A,B,C 

如果你喜歡解決它無線日AWK

awk -F'\\s*-[^,]*' -v OFS="" '{$1=$1}7' 

將工作:

kent$ awk -F'\\s*-[^,]*' -v OFS="" '{$1=$1}7' <<<'A - one,B - two,C - three' 
A,B,C 
+0

但他沒有說任何關於第一個字符後是否總是有空格和短劃線的內容。如果沒有,這是行不通的。 – MichalH

+0

@Mike它不是重點。然後只需添加'*' – Kent

0

我建議在 「純」 的bash以下解決方案:

X='A - one,B - two,C - three' 

IFS=',' read -ra A <<< "$X" 
RES='' 
for W in "${A[@]}" ; do 
    RES+=",${W:0:1}" 
done 

echo ${RES:1} 
0
echo 'A - one,B - two,C - three'| awk '{print $1substr($3,4)substr($5,4)}' 

A,B,C 
相關問題