Grep所有不以数字开头的字符串


10

我正在寻找grep以显示所有不以数字开头的字符。我做了这样的事情:

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

但它不起作用。您对某些reg exp有任何想法吗?


1
使用-v-o导致grep没有产生输出。
cuonglm

显示所有字符是什么意思?您是说不是以数字开头的行,还是要从输入中去除所有数字?
Matteo

默认情况下,grep使用基本正则表达式。这意味着您?将被视为文字问号。请转义问号\?,或-Eextended正则表达式使用选项,在这种情况下?为模式字符。
Peter.O 2015年

Answers:


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)上结束\>和\ <不起作用。因此,我提到了两个版本。我不得不在机器上使用丑陋的那个作为例子。
Matteo

从该名男子页\> 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符定制ewline y///翻译。并且,sed取决于实现,您可能还需要一个实际<tab>的代替\t反斜杠的转义符。


@don_crissti -哦,是的-我就把那个!的提前'"'调剂,但如果你使用bash,你可能想set +H,或者zsh那么set -K。我认为,任何引用的!扩展都是精神错乱。您还可以使用heredocs喜欢"${0#-}" <<\CMD\nyour cmd strings\nCMD\n在交互式shell中获得脚本化的行为。
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.