Tôi có một chuỗi "rtcpOnNbActive true"
được lưu trữ trong một biến x
. Tôi muốn trích xuất "true" dưới dạng chuỗi con và lưu trữ trong một biến. Tôi có thể làm cái này như thế nào?
Tôi có một chuỗi "rtcpOnNbActive true"
được lưu trữ trong một biến x
. Tôi muốn trích xuất "true" dưới dạng chuỗi con và lưu trữ trong một biến. Tôi có thể làm cái này như thế nào?
Câu trả lời:
Hãy thử cách này:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
hiển thị giá trị của x
.awk '{print $2}'
in trường thứ hai của hiển thị trước đó x
.$(
... )
Giữ đầu ra và gán nó cho y
.echo $x
là không hiển thị giá trị củax
. printf '%s\n' "$x"
sẽ là
awk '{print $2}'
in trường thứ hai của mỗi dòng được hiển thị trước đó x
.
Giả sử rằng có ít nhất một khoảng trắng trước chuỗi con bạn muốn trích xuất (và chuỗi con đó không chứa bất kỳ khoảng trắng nào), bạn có thể thực hiện việc này bằng cách mở rộng tham số đơn giản:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
đầu ra
[true]
echo
không thể mang theo cho bất kỳ thứ gì ngoài chuỗi ký tự không bắt đầu -
và không chứa bất kỳ chuỗi thoát nào. Hành vi của nó thay đổi ngay cả đối với nội dung bash, tùy thuộc vào cách nó được biên dịch và liệu có XPG_ECHO
được đặt hay không. Giả sử chuỗi không chứa chuỗi thoát, điều này sẽ ổn, nhưng printf '[%s]\n' "$y"
vẫn tốt hơn.
echo
để hiển thị giá trị của các biến, ngay cả trong các ví dụ "vứt đi" như thế này.
bạn có thể sử dụng awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
số trường trong hồ sơ hiện tại
sử dụng sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
sử dụng biểu thức chuỗi:
a="rtcpOnNbActive true"
echo ${a##* }
true
sử dụng grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o chỉ đưa ra kết hợp chính xác, [a-z]+
sẽ khớp chữ cái từ az và $
có nghĩa là ở cuối
echo
không thể mang theo cho bất kỳ thứ gì ngoài chuỗi ký tự không bắt đầu -
và không chứa bất kỳ chuỗi thoát nào. Hành vi của nó thay đổi ngay cả đối với nội dung bash, tùy thuộc vào cách nó được biên dịch và liệu có XPG_ECHO
được đặt hay không. Ngoài ra, bạn phải luôn luôn nhân đôi mở rộng biến số và thay thế lệnh (với một số ngoại lệ nhất định, trong trường hợp không cần thiết nhưng nó cũng không gây hại gì). Với một chuỗi như OP, điều này sẽ ổn, nhưng nếu bạn muốn chắc chắn printf '%s\n' "${a##* }"
sẽ tốt hơn.
Bạn có thể sử dụng tích read
hợp sẵn
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? Nó không phải read
là sự phân chia - nó là $IFS
. Vì một số lý do, rất nhiều người cho rằng việc chia tách $IFS
chỉ khi read
có liên quan. Bạn chỉ có thể làm: set -f; IFS=' '; printf %.0s%s $x
hoặc bất cứ điều gì. Trong mọi trường hợp - bạn cần chỉ định $IFS
giá trị của đây tại đây.
read
đang thực hiện phân tách bằng cách sử dụng IFS
, kiểm tra tài liệu . Ưu điểm chính của việc sử dụng read là nó đặt các biến (là một yêu cầu OP) và được cho rằng nó có thể phân tách các chuỗi và điền vào một mảng, rất tốt để trích xuất các trường tùy ý từ một chuỗi. Ngoài ra, tôi giả sử mặc định IFS
ở đây, nhưng đủ dễ để đặt nếu cần, IFS=$' \n\t' read -r _ y <<<"$x"
sẽ thực hiện thủ thuật
read
phân công, $IFS
chia nhỏ. nếu bạn muốn điền vào một mảng, hãy sử dụng set
- bạn không cần chuỗi vô nghĩa nhân tạo ở đây trong trường hợp đó. unset IFS
được mặc định hành vi $ IFS.
x
ngay trước chuỗi con bạn muốn trích xuất chứ?