Xóa chuỗi hàng đầu trong bash


10

Tôi có một chuỗi như thế rev00000010và tôi chỉ muốn số cuối cùng, 10 trong trường hợp này.

Tôi đã thử điều này:

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

cả hai đều không trả về gì, mặc dù biểu thức chính quy có vẻ đúng (đã thử với regexr )


Câu trả lời:


16

Các lệnh bạn đã chuyển sedcó nghĩa là: nếu một dòng khớp với biểu thức chính quy, hãy xóa nó . Đó không phải là những gì bạn muốn.

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

Điều này có nghĩa là: trên mỗi dòng, loại bỏ rev theo sau bởi bất kỳ số 0 nào.

Ngoài ra, bạn không cần sedmột điều đơn giản như vậy. Chỉ cần sử dụng bash và mở rộng tham số của nó :

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]*}"}

Sẽ loại bỏ mọi thứ ở bên trái của chữ số khác không bên trái.

Khéo léo / phổ biến:

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

Đầu tiên sẽ phá vỡ với dấu chấm, hex, dấu cách, v.v .: test='rev 003A0.1056'sẽ tạo ra number="3A0.1056". Thứ hai sẽ phá vỡ trên bất kỳ không gian, cùng một giá trị sẽ tạo ra: 003A0.1056từ expr.

3

Nếu bạn đã có TEST biến, chỉ cần in nó với tất cả các chữ cái đã bị xóa

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

hoặc là

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

Không sử dụng %dhoặc echo-command số có hàng đầu 0được hiểu làoctal


2

Một vài tùy chọn khác (mặc dù tôi cũng khuyên bạn nên sử dụng Mở rộng tham số theo đề xuất của @choroba):

  • Sử dụng sedhoặc perlđể thay thế mọi thứ trừ hai ký tự cuối cùng bằng hai ký tự cuối cùng. Điều này có hiệu quả xóa tất cả mọi thứ trừ hai cuối cùng.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Đặt awkdấu phân cách trường thành 2 hoặc nhiều 0 và in trường cuối cùng:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Chỉ trích xuất hai ký tự cuối cùng:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Chỉ in các byte thứ 10 cuối cùng:

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

Lưu ý rằng tất cả các sử dụng ở trên <<<$varlà một cấu trúc bash. Để sử dụng nó trong các shell khác, thay đổi thành echo "$TEST" | command.


1
Đối với awk biến thể khác có thể tránh một số vấn đềawk -F"[a-z]" '{print +$NF}'
Costas

0

Để lấy "số cuối", chọn bất kỳ dãy chữ số nào ở cuối chuỗi và chuyển đổi nó thành số thập phân:

Với Bash:

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

Với grep:

echo "$test" | grep -Po "[1-9][0-9]*$"
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.