Grep вся строка, которая не начинается с номера (ов)


10

Я ищу grep, чтобы показать все символы, которые не начинаются с цифр. Я сделал что-то вроде этого:

grep -v '^[1-2]*[a-zA-Z]?' -o

но это не работает. Есть ли у вас какие-либо идеи для некоторого рег опыта?


1
Использование -vс -oвызывающим grepпродуктом не выводится.
cuonglm

Что вы подразумеваете под показом всех персонажей ? Вы имеете в виду строки, которые не начинаются с цифр, или вы хотите вырезать все цифры из ввода?
Маттео

По умолчанию grepиспользуются основные регулярные выражения. Это означает, что с вами ?обращаются как с буквальным знаком вопроса. Либо экранируйте знак вопроса \?, либо используйте -Eопцию для extendedрегулярных выражений, в этом случае ?это символ шаблона.
Peter.O

Ответы:


22

grep -v '^[0-9]'

Выведет все строки, которые не ( -v) совпадают со строками, начинающимися ^с числа[0-9]

Например

$ cat test
string
string123
123string
1string2
$ grep -v '^[0-9]' test
string
string123

или если вы хотите удалить все слова, которые начинаются с цифры

sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g'

или с ярлыками и утверждениями

sed 's/\<\d\w*\>//g'

Например

$ cat test
one
two2
3three
4four4
five six
seven 8eight
9nine ten
11eleven 12twelve
a b c d
$ sed 's/[[:<:]][[:digit:]][[:alnum:]_]*[[:>:]]//g' test
one
two2


five six
seven 
 ten

a b c d

@mikeserv почему? Он удаляет каждое слово, начинающееся с цифры (как, возможно, было задано в исходном вопросе)
Matteo

1
Нет, это работает. Конец на OS X (и, возможно, другие BSD) \> и \ <не работают. По этой причине я упомянул обе версии. И мне пришлось использовать уродливый на моей машине для примера.
Маттео

Со страницы руководства \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '. `
Маттео

3

Это зависит от того, как вы определяете строку (например, считаете ли вы знаки препинания в строке или нет). Тем не менее, вы можете начать с чего-то вроде

grep -Po '\b[^[:digit:]].*?\b' file

2

Чтобы удалить все слова из строки, начинающейся с цифры, sedвы можете сделать:

sed 'x;s/.*//;G
     s/[[:space:]][[:punct:]]\{0,1\}[0-9][^[:space:]]*//g
     s/\n//'

... или, если вам нужны только слова, которые не начинаются с цифр, напечатанных в отдельной строке:

sed 'y/!\t "'"'?/\n\n\n\n\n\n/;/^[_[:alpha:]]/P;D"

... вышесказанное должно быть довольно хорошо. Вы захотите адаптировать \nэлектронный y///перевод для делителей, которые вы считаете актуальными. И, в sedзависимости от реализации, вам может потребоваться фактическая замена <tab>вместо \tобратной косой черты.


@don_crissti - О да, я поставлю это !перед свопом '"', но если вы используете, bashвы можете захотеть set +Hили если zshтогда set -K. На мой взгляд, любое цитируемое !расширение - это безумие. Вы также можете использовать heredocs, например, "${0#-}" <<\CMD\nyour cmd strings\nCMD\nчтобы получить сценарий поведения в интерактивных оболочках.
mikeserv

Спасибо за "${0#-}" <<...совет!
don_crissti

@don_crissti - Если вы используете, "${0#-}" -s -- arg list <<\CMD\n...вы также можете установить позиционные параметры при вызове. Использование "$@"или *часто полезно для меня вместо arg list. А с ним ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...можно получить новый $0и еще справиться с stdin.
mikeserv
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.