ลบสตริงนำในทุบตี


10

ฉันมีสตริงเหมือนrev00000010และฉันต้องการเพียงหมายเลขสุดท้าย 10 ในกรณีนี้

ฉันได้ลองสิ่งนี้แล้ว:

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'

ทั้งสองส่งคืนอะไรแม้ว่า regex ดูเหมือนจะถูกต้อง (ลองกับregexr )


คำตอบ:


16

คำสั่งที่คุณส่งผ่านไปยังsedหมายถึง: หากสายตรง regex ลบมัน นั่นไม่ใช่สิ่งที่คุณต้องการ

echo "$TEST" | sed 's/rev0*//'

ซึ่งหมายความว่า: ในแต่ละบรรทัดให้ลบ rev ตามด้วยจำนวนศูนย์ใด ๆ

นอกจากนี้คุณไม่จำเป็นต้องsedมีสิ่งง่ายๆ เพียงใช้ bash และการขยายพารามิเตอร์ :

shopt -s extglob         # Turn on extended globbing.
echo "${TEST##rev*(0)}"  # Remove everything from the beginning up to `rev`
                         # followed by the maximal number of zeroes.

5

POSIXly:

test='rev00000010'
number=${test#"${test%%[1-9]*}"}

จะลบทุกสิ่งทางด้านซ้ายของหลักซ้ายสุดที่ไม่ใช่ศูนย์

Bournely / สากล:

number=`expr "x$test" : 'xrev0*\(.*\)'`

เป็นครั้งแรกที่จะทำลายจุดฐานสิบหกช่องว่าง ฯลฯ : จะผลิตtest='rev 003A0.1056' number="3A0.1056"ที่สองจะทำลายพื้นที่ใด ๆ ค่าเดียวกันจะผลิต: 003A0.1056จาก expr

3

หากคุณมีตัวแปร TEST อยู่แล้วให้พิมพ์โดยลบตัวอักษรทั้งหมดออก

printf "%.0f\n" ${TEST//[a-z]/}

หรือ

printf "%g\n" ${TEST//[a-z]/}

อย่าใช้%dหรือecho- คำสั่งเพราะหมายเลขที่มีเครื่องหมายกำกับ0นั้นเป็นที่เข้าใจกันว่าoctal


2

ตัวเลือกเพิ่มเติมเล็กน้อย (แม้ว่าฉันขอแนะนำให้คุณใช้การขยายพารามิเตอร์ตามที่แนะนำโดย @choroba):

  • ใช้sedหรือperlเพื่อแทนที่ทุกอย่างยกเว้นอักขระสองตัวสุดท้ายด้วยอักขระสองตัวสุดท้าย การดำเนินการนี้จะลบทุกอย่างยกเว้นสองรายการสุดท้าย

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • ตั้งค่าawkตัวคั่นฟิลด์เป็น 2 หรือมากกว่า 0 วินาทีแล้วพิมพ์ฟิลด์สุดท้าย:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • แยกเฉพาะอักขระสองตัวสุดท้าย:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • พิมพ์เฉพาะ 10 ไบต์สุดท้าย:

    $ cut -b 10- <<<$TEST
    10
    

โปรดทราบว่าการใช้งานด้านบนทั้งหมด<<<$varซึ่งเป็นการสร้างทุบตี ที่จะใช้ในเปลือกหอยอื่น ๆ echo "$TEST" | commandเปลี่ยนไป


1
สำหรับตัวแปรอื่น ๆ awk ซึ่งสามารถหลีกเลี่ยงปัญหาบางอย่างawk -F"[a-z]" '{print +$NF}'
Costas

0

ในการรับ "หมายเลขสุดท้าย" เลือกลำดับของตัวเลขใด ๆ ที่ท้ายสตริงและแปลงเป็นเลขทศนิยม:

ด้วยการทุบตี:

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

ด้วย grep:

echo "$test" | grep -Po "[1-9][0-9]*$"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.