2016-05-03 3 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 's/[^ a-zA-Z] [^ a-zA-Z] * $ //'', но для общего решения см. ответ Джона ниже. –

ответ

3

В коде есть две проблемы. Во-первых, [$ ] будет соответствовать буквальному знаку доллара, но, как можно надеяться, не соответствует концу строки. Другим является то, что в то время как 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 СЭД. Он должен работать с BSD/OSX СЭД только с небольшими изменениями.)

+1

Я не мог придумать лучшего примера, чтобы указать преимущества границ в расширенном регулярном выражении, чем этот. –