2009-12-14 27 views
16

Tôi chỉ muốn khớp một số văn bản trong tập lệnh BASH, tôi đã thử sử dụng sed, nhưng tôi dường như không thể tạo kết quả khớp thay vì thay thế nó bằng thứ gì đó.Trả lại kết quả regex trong tập lệnh BASH, thay vì thay thế nó

echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g' 

Mà sẽ đầu ra: TestTdontReplaceString

Mà không phải những gì tôi muốn là, tôi muốn nó ra: 100

Lý tưởng nhất là tôi muốn nó để đặt tất cả các trận đấu trong một mảng.

chỉnh sửa: Nhập văn bản đang đến trong như là một chuỗi:

newName() 
{ 
#Get input from function 
newNameTXT="$1" 

if [[ $newNameTXT ]]; then 
#Use code that im working on now, using the $newNameTXT string. 

fi 
} 

Trả lời

21
echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/' 

echo "TestT100String" | grep -o '[0-9]\+' 

Phương pháp bạn sử dụng để đưa các kết quả trong một mảng phụ thuộc phần nào vào cách dữ liệu thực tế đang được truy lục. Không có đủ thông tin trong câu hỏi của bạn để có thể hướng dẫn bạn tốt. Tuy nhiên, đây là một phương pháp:

index=0 
while read -r line 
do 
    array[index++]=$(echo "$line" | grep -o '[0-9]\+') 
done < filename 

Dưới đây là một cách khác:

array=($(grep -o '[0-9]\+' filename)) 
+0

Đã thêm vào phương thức nhập trong câu hỏi gốc. (đầu vào là trong diễn đàn của một chuỗi) – Mint

5

Sử dụng grep. Sed là một biên tập viên. Nếu bạn chỉ muốn đối sánh với một regexp, grep là quá đủ.

+0

SED không ghi vào tệp nguồn - cách duy nhất để điều đó xảy ra là nếu bạn viết đầu ra có cùng tên tệp để ghi đè lên tệp. –

+0

Đúng, nhưng sed vẫn là một biên tập viên. Tên của nó thậm chí còn ngắn cho trình soạn thảo luồng. Nếu anh ta chỉ cần phù hợp với anh ta có thể sử dụng grep. – Mic

+1

tôi không nghĩ anh ấy muốn phù hợp. Anh ta nói rằng anh ta cần 100 – ghostdog74

28

Bạn có thể làm điều này hoàn toàn trong bash sử dụng vuông khung [[ ]] hành kiểm tra hai lần, mà các cửa hàng kết quả trong một mảng gọi BASH_REMATCH:

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}" 
+1

phải mất một con khỉ thực tế để con số này ra – Prospero

+1

Nhưng xem http://stackoverflow.com/questions/218156/bash-regex-with-quotes cho các vấn đề với bash trích dẫn trong các phiên bản BASH khác nhau . –

0

Vâng, Sed với s/"pattern1"/"pattern2"/g chỉ thay thế toàn cầu tất cả các pattern1s để mô hình 2.

Bên cạnh đó, mặc dù sed mặc định in toàn bộ dòng theo mặc định. Tôi đề nghị đường ống dẫn đến một lệnh cắt và cố gắng để trích xuất các số u muốn:

Nếu u đang lookin chỉ sử dụng sed sau đó sử dụng TRE:

sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'. 

tôi dint cố gắng và thực hiện lệnh trên vì vậy chỉ cần đảm bảo cú pháp là đúng. Hy vọng điều này sẽ hữu ích.

1

sử dụng awk

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1' 
100 
-2

chỉ sử dụng bash shell

declare -a array 
i=0 
while read -r line 
do 
     case "$line" in 
      *TestT*String*) 
      while true 
      do 
       line=${line#*TestT} 
       array[$i]=${line%%String*} 
       line=${line#*String*} 
       i=$((i+1)) 
       case "$line" in 
        *TestT*String*) continue;; 
        *) break;; 
       esac 
      done 
      esac 
done <"file" 
echo ${array[@]} 
1

Tôi không biết tại sao không ai sử dụng expr: đó là xách tay và dễ dàng.

newName() 
{ 
#Get input from function 
newNameTXT="$1" 

if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then 
    echo "contains $num" 
fi 
} 
13

Tinh khiết Bash. Sử dụng thay thế thông số (không có quy trình và đường ống bên ngoài):

Xóa tất cả các chữ số.

+1

Điều này thực sự cần phải có nhiều upvotes hơn. –

Các vấn đề liên quan