Từ thứ n trong một biến chuỗi


85

Trong Bash, tôi muốn lấy từ thứ N của một chuỗi được giữ bởi một biến.

Ví dụ:

STRING="one two three four"
N=3

Kết quả:

"three"

Lệnh / script Bash nào có thể làm được điều này?

Câu trả lời:


95
echo $STRING | cut -d " " -f $N

3
việc cắt sẽ không thành công khi yêu cầu một trường không tồn tại. Thay vì trả về "" nó sẽ trả về chính chuỗi. Ví dụ: echo "aaaa" | kết quả cut -f2 là "aaaa", không phải kết quả có độ dài bằng 0 trống.
ajaaskel

@ajaaskel Điều đó dường như xảy ra khi không tìm thấy dấu phân cách trong đầu vào. Và hành vi đó ngày nay có thể được thay đổi bằng cách sử dụng tùy chọn - chỉ được phân tách.
Samuli Pahaoja

64

Một sự thay thế

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
Sử dụng mảng bash cho đây là giải pháp "tốt nhất", tôi ghét sử dụng awk hoặc sed, vì tôi không thấy chúng được cài đặt trên tất cả các thiết lập, đặc biệt là thiết lập msys.
Sundar

1
Mặc dù tiếng vọng "không cần thiết", tôi thấy nó hữu ích để hiểu cách sử dụng các phần tử arr. Cảm ơn
Chen Li Yong

1
Nếu bạn đã đặt IFS(dấu phân tách trường bên trong) thành ':' hoặc thứ gì đó thay vì khoảng trắng, hãy thay đổi lại trước khi thử.
Noumenon

1
Đây phải là câu trả lời đúng. Sử dụng mảng cho mục đích này vừa đơn giản vừa thông minh.
ajaaskel

31

Sử dụng awk

echo $STRING | awk -v N=$N '{print $N}'

Kiểm tra

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three

9

Một tệp chứa một số câu lệnh:

cat test.txt

Kết quả :

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

Vì vậy, để in từ thứ 4 của loại câu lệnh này:

cat test.txt |awk '{print $4}'

Đầu ra:

1st
2nd
3rd
4th
5th

2
OP nói rằng chuỗi nằm trong một biến, không phải một tệp.
codeforester

3

Không có nĩa đắt tiền, không có đường ống, không có bản hiệu:

$ set -- $STRING
$ eval echo \${$N}
three

Nhưng hãy cẩn thận với sự lấp lánh.


2
STRING=(one two three four)
echo "${STRING[n]}"

2
Trong ví dụ của bạn, STRING có thực sự là một chuỗi không? Nó trông giống như một mảng.
Nicolas Raoul

@NicolasRaoul Vâng, thực ra bạn nói đúng. Nhưng tôi đã viết để thay thế cho.
mnrl
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.