Grep tất cả các chuỗi không bắt đầu bằng số (s)


10

Tôi đang tìm kiếm grep để hiển thị tất cả các ký tự không bắt đầu bằng số. Tôi đã làm một cái gì đó như thế này:

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

nhưng nó không hoạt động. Bạn có bất cứ ý tưởng cho một số reg exp?


1
Sử dụng -vvới -ogây ra grepsản xuất không có đầu ra.
cuonglm

Bạn có ý nghĩa gì khi hiển thị tất cả các nhân vật ? Bạn có nghĩa là các dòng không bắt đầu bằng số hoặc bạn muốn loại bỏ tất cả các số từ đầu vào?
Matteo

Theo mặc định, grepsử dụng các biểu thức chính quy cơ bản . Điều này có nghĩa là bạn ?đang được coi là một dấu hỏi theo nghĩa đen. Hoặc thoát dấu chấm hỏi \?hoặc sử dụng -Etùy chọn cho extendedcác biểu thức thông thường, trong trường hợp đó ?là một ký tự mẫu.
Peter.O 25/2/2015

Câu trả lời:


22

grep -v '^[0-9]'

Sẽ xuất tất cả các dòng không ( -v) khớp với các dòng bắt đầu ^bằng một số[0-9]

Ví dụ

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

hoặc nếu bạn muốn xóa tất cả các từ bắt đầu bằng một chữ số

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

hoặc với các phím tắt và xác nhận

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

Ví dụ

$ 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

@mikeerv tại sao? Nó xóa mọi từ bắt đầu bằng một chữ số (như có thể được hỏi trong câu hỏi ban đầu)
Matteo

1
Không, nó không hoạt động. Kết thúc trên OS X (và có thể các BSD khác) \> và \ <không hoạt động. Vì lý do này, tôi đã đề cập đến cả hai phiên bản. Và tôi đã phải sử dụng một cái xấu xí trên máy của tôi làm ví dụ.
Matteo

Từ trang người đàn ông \> Matches the null string at the end of a word. This is equivalent to [[:>:]] '. `
Matteo

3

Nó phụ thuộc vào cách bạn xác định một chuỗi (ví dụ: nếu bạn đếm các ký tự dấu chấm câu thành chuỗi hay không). Tuy nhiên, bạn có thể bắt đầu từ một cái gì đó như

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

2

Để xóa tất cả các từ khỏi một dòng bắt đầu bằng một số với sedbạn có thể làm:

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

... hoặc, nếu bạn chỉ muốn những từ không bắt đầu bằng số được in trên mỗi dòng riêng biệt:

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

... Ở trên nên làm khá tốt. Bạn sẽ muốn điều chỉnh bản dịch \newline y///cho các bộ chia mà bạn nghĩ là có liên quan. Và, sedtùy thuộc vào việc thực hiện, bạn cũng có thể muốn thực tế <tab>thay cho \tlối thoát dấu gạch chéo ngược.


@don_crissti - Ồ, vâng - Tôi sẽ đặt nó !trước khi '"'trao đổi, nhưng nếu bạn đang sử dụng, bashbạn có thể muốn set +Hhoặc nếu zshsau đó set -K. Theo tôi, bất kỳ !sự mở rộng được trích dẫn là điên rồ. Bạn cũng có thể sử dụng heredocs như "${0#-}" <<\CMD\nyour cmd strings\nCMD\nđể có được hành vi theo kịch bản trong các vỏ tương tác.
mikeerv

Cảm ơn vì tiền "${0#-}" <<...boa!
don_crissti

@don_crissti - Nếu bạn sử dụng, "${0#-}" -s -- arg list <<\CMD\n...bạn cũng có thể đặt các tham số vị trí tại lệnh gọi. Sử dụng "$@"hoặc *thường hữu ích cho tôi thay cho arg list. Và với ln -s "$(command -v "${0#-}")" /tmp/new_name; cd tmp; new_name <<\CMD\n...bạn có thể có được một $0stdin mới và vẫn xử lý.
mikeerv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.