2017-08-07 30 views
0

私はほとんどの場合にShellの文字列から最初の文字を抽出する方法は?

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

の予想される出力

A,B,C 
+3

あなた自身のために何をしようとしたのですか?あなたは研究努力を示さずにコードを要求していますか? – Inian

+1

あなたは何もせずに質問したと思いますか?私はUNIXの新しい初心者ではありませんが、私はマスターではありません。 –

+1

とにかく無礼ではありませんが、コミュニティは質問を投稿する前に研究努力を掲示しなければならず、曖昧ではありません。 – 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

「最初の文字」を抽出する必要があり、そこから(カンマで区切られた)文字列を持っている、これは動作するはずです(アスキー)

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 \}'があります。最後の部分の後にコンマはありません。この部分を最初の文字とコンマだけで置き換えると、最初の文字のカンマの最初の文字のカンマなどのようになります。そして、最後のカンマを2番目の置換子 's /、$ //'で削除します。それでおしまい。 – MichalH

+0

あなたの説明をありがとう –

0

このはワンライナーは、あなたの例のために働く必要がありをセッド:

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

テスト:

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

あなたが愛するならばそれを解決する

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

が動作します:awkの番目

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

しかし、彼は常に最初の文字の後に空白とダッシュがあるかどうかについて何も言わなかった。それがなければ、これはうまくいかないでしょう。 – MichalH

+0

@それはポイントではないです。次に '*'を加えてください – 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 
関連する問題