2013-12-23 2 views
0

Это строка у меня есть:расщепленные строка, содержащая специальные символы

COUNT(*) 154

Часть I нужно 154 (число после пробела).

Я попытался sed и cut команды, как, например: для СЕПГ:

's/COUNT(\*) //' 

Таким образом, только номер остается. Но это не сработает.

+2

, и вы уверены, что все это на одной линии? Обычно существует символ '\ n' (новая строка), отделяющий заголовок от значения. Удачи. – shellter

+0

@ikegami С 'sed' они не экранируются по умолчанию - только при вызове с' -E' (базовое или расширенное регулярное выражение). – mklement0

ответ

2

echo "COUNT (*) 154" | awk -F "" '{print $ 2}'

echo "COUNT (*) 154" | вырезать -d»" -f2

1

Вместо сырой, но если COUNT(*) строка не меняется, и вы хотите использовать cut вы можете использовать:

echo "COUNT(*) 154" | cut -c10- 

Это будет захватывать что-то с 10-го символа вперед ,

1

Другой вариант:

cut -d' ' -f2 <<<'COUNT(*) 154' 

Вы говорите cut вернуть 2-ое пространство разделителем поля.

Обратите внимание, что одинарная кавычка входной строки обеспечивает ее буквальное использование без переменной интерполяции или расширения оболочки.

Update: Для того, чтобы решить исходную проблему:

СЕПГ Командование OP, в 's/COUNT(\*) //' на самом деле работает:

sed 's/COUNT(\*) //' <<< 'COUNT(*) 154' # -> '154' 

Обратите внимание, что sed использует основные регулярных выражений по умолчанию, поэтому () НЕ должно быть сбежал - напротив, -E ожидает extended regexes, для которых требуется экранирование ():

sed -E 's/COUNT\(\*\) //' <<< 'COUNT(*) 154' # -> '154' 

Это оставляет нам интересно (как @shellter предполагает), действительно ли входная строка просто буквальный COUNT(*) 154 и не содержит других символов. таких как \n, \r, t.

легкий способ изучить фактические символы заключается в использовании:

od -a <<< 'COUNT(*) 154' 

Это будет символ за символом представление входной строки (строго говоря: байты в байтах), с управляющими символами символически символически; например: nl для \n, ht для \t, sp для пространства.

2
echo "COUNT(*) 154"|awk '{print $NF}' 
echo "COUNT(*) 154"|awk '{print $2}' 
2

Встроенная read команда Bash может справиться с этим:

$ s='COUNT(*) 154' 
$ read a b <<< "$s" 
$ echo $b 
154 

Если имеется несколько пробельных разделенных слов, прочитать строку в массив:

$ s='COUNT (*) 154' 
$ read -a words <<< "$s" 
$ echo "${#words[@]}" 
3 
$ echo "${words[-1]}" 
154 

Если, как предполагает @shelter, ваша строка фактически содержит строку вместо пространства:

$ s='COUNT(*) 
154' 
$ { read header; read value; } <<< "$s" 
$ echo $value 
154 
2

Баш решение удаления всех нецифровые:

str='COUNT(*) 154' 

echo "${str//[^0-9]/}" 

Выход на

154 
+0

Немного более общая альтернатива: 'echo '$ {str ## *}" '- удаляет все до и включая последнее пространство - т. Е. Возвращает последний маркер, разделенный пробелами. – mklement0

Смежные вопросы