2014-01-04 4 views
0

Я хотел бы разбить строковую переменную на две части. Строка имеет вид:Как я могу разделить строку на две с POSIX sh?

mingw32mingw32 
linux64mingw32 
mac64mingw64 

Я хотел бы выйти:

mingw32 mingw32 
linux64 mingw32 
mac64 mingw64 

я знаю о cut, но я думаю, что это слишком просто для этого. Я также могу сделать это вручную (есть действительно только пять или шесть вариантов), но я чувствую, что есть лучший способ. Я просто не слишком разбираюсь в инструментах оболочки.

Примечание. Я хочу, чтобы это работало в POSIX sh для максимальной совместимости, поэтому нет GNU- или Bash-isms.

ответ

2

Вы можете использовать POSIX оболочку подстановку переменную, но это становится немного грязным. Для того, чтобы получить хвост, где цифра, за которым следует алфавитному:

tail=${var#*[0-9][a-z]} 

Это получает почти правильный хвост, то есть что-то вроде ingw32. Чтобы исправить это, получить голову обрезкой один символ плюс хвост:

head=${var%?$tail} 

Теперь собственно хвост значение с головой отделан:

tail=${var#$head} 
+0

Вы, сэр, блестящие. Это должно быть самым легким решением (и наиболее переносимым) возможным ':-)'. – rubenvb

0

вы можете сделать это с помощью sed

sed 's/\([0-9]\)\([a-z]\)/\1\t\2/' file 

или

sed 's/\([0-9]\+\)/\1\t/' file 

Если ширина 2-го столбца всегда 7

sed 's/\(.......\)$/\t\1/' file 

или

sed 's/\(.\{7\}\)$/\t\1/' file 
0

Использование Gnu AWK:

gawk '{print gensub(/([0-9]+)/, "\\1 ", 1)}' file 
mingw32 mingw32 
linux64 mingw32 
mac64 mingw64 

ИЛИ Вы можете использовать задать расширенный:

egrep -o '[A-Za-z]+[0-9]+' file 
mingw32 
mingw32 
linux64 
mingw32 
mac64 
mingw64 
Смежные вопросы