Điểm:0

lệnh echo ngắt dòng, được sử dụng trong các vòng lặp

lá cờ br

Trong tệp 'foo' của tôi có dòng đầu tiên: 'a b' và dòng thứ hai: 'c d':

$ foo mèo
một b 
đĩa CD

Tôi muốn in trong thiết bị đầu cuối trong vòng lặp hai dòng sau: lần lượt:

$ cho tôi trong $(cat foo); lặp lại $i; xong

Nhưng trong lệnh 'echo' đầu ra sẽ phá vỡ thứ tự, vì vậy thay vì có:

một b
đĩa CD

Tôi thực sự có:

một
b
c
đ
pLumo avatar
lá cờ in
`for i in $(cat foo)` không lặp các dòng nhưng các từ được phân tách bằng dấu tách trường của bạn (`IFS`).
lá cờ br
Vì vậy, làm cách nào tôi có thể lặp dòng/thay đổi chế độ IFS thành dòng lặp chứ không phải từ?
pLumo avatar
lá cờ in
Nếu bạn cho chúng tôi biết bạn thực sự muốn làm gì, chúng tôi có thể giúp bạn thực hiện đúng cách bằng cách sử dụng `sed` hoặc tương tự.,
Điểm:4
lá cờ in

cho tôi bằng $(cat foo) không lặp dòng nhưng các từ (hoặc trường) được chia theo tách trường $IFS. Nó mặc định là \n\t (dấu cách, dòng mới, tab).

Nếu bạn chỉ thay đổi dấu tách trường của mình thành dòng mới, bạn có thể sử dụng lệnh của mình như hiện tại (từ chối trách nhiệm: xin vui lòng đọc dưới đây!):

NẾU=$'\n'
cho tôi bằng $(cat foo); lặp lại $i; xong

Bạn có thể muốn tạo một bản sao lưu của IFS để khôi phục nó sau này:

OLD_IFS="$IFS"
.
.
.
IFS="$OLD_IFS"

Đầu ra:

một b
đĩa CD

Tuy nhiên, đây được coi là xấu luyện tập.

  • Tốt hơn một chút: trong khi IFS= đọc -r dòng; làm ... xong < file
  • Tốt hơn nhiều: Sử dụng một công cụ chuyên dụng cho nhiệm vụ của bạn, chẳng hạn như tiếng kêu, sed hoặc awk.

Xin vui lòng đọc Tại sao sử dụng vòng lặp trình bao để xử lý văn bản được coi là thông lệ không tốt?.

lá cờ br
Làm cách nào tôi có thể sử dụng 'grep' để thay thế?
pLumo avatar
lá cờ in
Chúng tôi không thể biết, bởi vì chúng tôi không biết bạn muốn làm gì, hãy xem nhận xét cuối cùng của tôi về câu hỏi của bạn.
Điểm:2
lá cờ ph

Bạn có thể dùng trong khi đọc vì mục đích này

[/tmp]$ trong khi đọc dòng ; thực hiện tiếng vang $line ; hoàn thành < foo                                     
một b
đĩa CD

Thêm dấu phân cách để bạn hiểu

[/tmp]$ trong khi đọc dòng ; thực hiện tiếng vang $line ; tiếng vang "----" ; hoàn thành < foo                       
một b
----
đĩa CD
----
[/tmp]$    
lá cờ br
Nếu tôi muốn làm theo giải pháp của bạn, nhưng cũng muốn thêm một câu lệnh có điều kiện bên trong vòng lặp for của tôi, thì "$i" sẽ là gì? Ý tôi là, đại loại như thế này: for i in $(while read line ; do echo $line ; done
lá cờ hr
Lưu ý rằng `$line` nên được trích dẫn `"$line"` vì những lý do tương tự (nếu không, từ đó sẽ bị tách từ thành các mã thông báo riêng biệt - ví dụ: hãy thử dùng `a b` thay cho `a b`).
lá cờ hr
... đồng thời, `read` vẫn sẽ xóa mọi khoảng trắng ở đầu và mở rộng các chuỗi thoát theo mặc định, do đó, nói chung, nếu bạn muốn lặp lại các dòng *exactly*, bạn muốn `while IFS= read -r line; do ...` hoặc (để bao gồm dòng cuối cùng có thể bị kết thúc không đúng cách) `while IFS= read -r line || [[ -n "$line" ]]; làm...`
bac0n avatar
lá cờ cn
@JosefKlimuk ``` trong khi đọc -r; làm nếu ! grep -oe 'a'

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.