Shell Script: คว้าสตริงที่อยู่ตรงกลางของข้อความบางครั้งในตอนเริ่มต้น


9

ฉันมีไฟล์ข้อความขนาดใหญ่ที่ส่วนหนึ่งของมันมีลักษณะเช่นนี้ (ค่าที่แก้ไข):

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

ผมต้องการที่จะคว้าเสมอ (มีcutหรือawkหรือสิ่งอื่น) สตริงที่เริ่มต้นด้วยXXXX00แต่ก็ไม่เคยอยู่ในจำนวนสนามเดียวกัน

ฉันจะทำสิ่งนั้นในเชลล์สคริปต์ได้อย่างไร

คำตอบ:


12

เพียงgrepเพื่อมัน

grep -oE 'XXXX00[0-9]*' file
  • -o: พิมพ์เฉพาะส่วนที่ตรงกัน
  • -E: เปิดใช้งานการแสดงออกปกติเพิ่มเติม
  • [0-9]*: หลังจากที่สตริงค้นหาแล้วจะปรากฏเฉพาะตัวเลขเท่านั้น

โปรดทราบว่า regex ไม่ต้องการ-Eตัวเลือก (แม้ว่าจะไม่เป็นอันตราย)
Jonathan Leffler


3

ใช้grepกับ PCRE:

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

คุณสามารถหลีกเลี่ยงด้วย-w(คำ) ในกรณีนี้โปรดทราบว่าคำว่าตัวอักษรที่เป็นส่วนประกอบจะถือว่าเป็น[[:alnum:]_]:

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

2

อีกสองวิธี

ด้วย GNU awk

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

กับรุ่นเก่าของ GNU awk, --re-intervalอาจมีความจำเป็นเพื่อให้

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

ด้วยtrและgrep

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

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

ดูเหมือนว่าจำนวนฟิลด์จะแตกต่างกันเพราะคุณมีรายชื่อคนอยู่ที่นั่นและพวกเขามีชื่อต่างกัน แต่อาจไม่มีชื่อที่มี 0 อยู่ในนั้นดังนั้นให้ตัดไปจนถึงสตริงที่คั่นด้วยช่องว่างแรกโดยสมบูรณ์ด้วยสตริงหนึ่งในนั้นบันทึกและตัดทั้งหมดที่ตามมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.