2016-05-03 6 views
1

bashの文字列/配列(変換は簡単)から桁のみの要素を削除する際に問題があります。トリックは、配列内に数字と他の文字の両方を含む要素があり、それらを保持したいと考えています。bashの配列/文字列から番号のみの要素を削除する

ので

VAR="a2b a22 12b 417 900 600 86400 3600" 

のための出力は、私が行くことができる遠いがある

"a2b a22 12b" 

次のようになります。

echo ${VAR}# | sed 's/ [0-9][0-9]*[$ ]/ /g' 

それはまだ問題を解決していません。私は配列でそれをやろうとしましたが、 "$"と "^"がなければ、 "良い要素"の一部の削除を防ぐことはできません。

誰でも私を助けることができますか?

+1

すべての数字のあなたの順序は*必ず*混合シーケンスを以下の場合は、あなたがすることによって得ることができます正規の正規表現 'sed '/ [^ a-zA-Z] [^ a-zA-Z] * $ //''である。 –

答えて

3

コードには2つの問題があります。 1つは、[$ ]はリテラルドル記号と一致しますが、希望の通り、行末には一致しません。もう1つは、gはグローバルマッチングを示していますが、マッチは重複することはできません。

あなたはGNU sed持っている場合は、簡単な解決策は、スペースにマッチするのを避ける、代わりに単語の境界をマークする\<\>を使用することです:

また
$ echo ${VAR} | sed -E 's/\<[0-9][0-9]*\>/ /g' 
a2b a22 12b  

、GNU拡張せずに、あなたはループを使用することができます。

$ echo ${VAR} | sed 's/^[0-9][0-9]*//; :a; s/ [0-9][0-9]*//g; t a; s/ [0-9][0-9]*$/ /' 
a2b a22 12b 

コード:aはラベルを示します。コードt aはテストを示します。以前の置換コマンドが置換を行った場合、sedはラベルaにジャンプします。

(上記のGNUの下でテストしたがsedの。それはわずかな調整をsedのBSD/OSXで動作するはずです。)

+1

私は、これよりも広範な正規表現で境界の利点を指摘する良い例は考えられませんでした。 –

関連する問題