Shell Script: lấy chuỗi ở giữa văn bản, đôi khi ở đầu


9

Tôi có một tệp văn bản lớn trong đó một phần của nó trông như thế này (giá trị được chỉnh sửa):

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

Tôi muốn luôn luôn lấy (bằng một cuthoặc awkmột cái gì đó khác) chuỗi bắt đầu bằng XXXX00, nhưng nó không bao giờ trong cùng một số trường.

Làm thế nào tôi có thể làm điều đó trong một kịch bản shell?

Câu trả lời:


12

Chỉ grepcho nó:

grep -oE 'XXXX00[0-9]*' file
  • -o: Chỉ in phần phù hợp.
  • -E: Kích hoạt các biểu thức chính quy mở rộng.
  • [0-9]*: Sau chuỗi tìm kiếm, chỉ các số sẽ xuất hiện.

Lưu ý rằng regex không cần -Etùy chọn (mặc dù nó không có hại).
Jonathan Leffler


3

Sử dụng grepvới PCRE:

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

Bạn có thể thoát khỏi -w(từ) trong trường hợp này, lưu ý rằng các ký tự cấu thành từ được coi là [[:alnum:]_]:

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

2

Một vài cách khác

Với GNU awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Với các phiên bản cũ hơn của GNU awk, --re-intervalcó thể cần thiết, vì vậy

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Với trgrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'

1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

có vẻ như số trường khác nhau vì bạn có một danh sách những người ở đó và họ có số lượng tên khác nhau. nhưng có lẽ không ai trong số họ có tên có 0 trong đó, vì vậy chỉ cần cắt hoàn toàn chuỗi ký tự phân cách không gian đầu tiên với một chuỗi trong đó, lưu nó và cắt tất cả những thứ tiếp theo.

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.