Xargs phân tách dòng mới


40

Có thể chỉxargs sử dụng dòng mới làm dấu phân cách? (bash trên Linux và OS X nếu có vấn đề)

Tôi biết -0có thể được sử dụng, nhưng đó là PITA vì không phải lệnh nào cũng hỗ trợ đầu ra được phân tách bằng NUL.


Bạn đang cố gắng đạt được điều gì Có thể có một cách khác để đi về nó.
Dennis Williamson

@Dennis Tôi sử dụng nó cho nhiều thứ khác nhau, thường trong đường ống với grep, sed, awk rất cơ bản, v.v., chủ yếu là để thực hiện song song. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4là quá nhiều để gõ so với ls *.foo | xargs -P4.
Kornel

Kịch bản và chức năng là hai cách tuyệt vời để giảm gõ.
Dennis Williamson

Đây là một câu hỏi SO, phải không?
Charles Stewart

Câu trả lời:


17

Một cái gì đó dọc theo dòng

alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command

nên làm việc.


38
tr '\n' '\0'làm việc quá
Kornel

2
perl là quá mức cần thiết cho một nhân vật. trnhanh hơn cho cả cpu và ngón tay của bạn.
Xin chào thế giới

52

GNU xargs (mặc định trên Linux; cài đặt findutilstừ MacPorts trên OS X để lấy nó) hỗ trợ -dcho phép bạn chỉ định một dấu phân cách tùy chỉnh cho đầu vào, vì vậy bạn có thể làm

ls *foo | xargs -d '\n' -P4 foo 

Tôi có alias xxargs="xargs -d '\n'"trong bashrc của tôi. Vì vậy, tôi chỉ có thể làm những việc như thế này:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl

4
Đây thực sự nên là câu trả lời được chấp nhận. Không cần phải thoát ra khỏi perl. Mặc dù đó trlà một ý tưởng tốt quá.
Ehtesh Choudhury

3
brew install findutilsgxargschính xác là những gì tôi cần trên OS X, cảm ơn.
Brad Koch

5

Với Bash, tôi thường thích tránh xargs cho bất cứ điều gì ít rắc rối nhất, có lợi cho các vòng lặp trong khi đọc. Đối với câu hỏi của bạn, while read -ar LINE; do ...; donethực hiện công việc (nhớ sử dụng cú pháp mảng với LINE, ví dụ: ${LINE[@]}cho toàn bộ dòng). Điều này không cần bất kỳ mánh khóe nào: theo mặc định, đọc sử dụng giống \nnhư ký tự kết thúc dòng.

Tôi nên đăng câu hỏi lên SO về ưu và nhược điểm của xargs so với vòng lặp while-read ... đã xong!


2
Điều này chỉ có thể thi đua xargs -n1 -d'\n', và không phải toàn bộ xargs.
Xin chào thế giới

@HelloWorld - Bạn có thể bó các đối số lại với nhau đủ dễ dàng, do đó bạn có thể mô phỏng xargs -n$Ntốt chỉ với một chút kịch bản bổ sung.
Charles Stewart

Vâng, tôi nằm trong số những người ủng hộ, đó chỉ là một nhận xét đáng nói.
Xin chào thế giới

Đây chính xác là những gì tôi làm! Ngoài ra, bạn có thể sử dụng các readtùy chọn, như đọc thêm từ trong các biến riêng biệt hoặc thay đổi dấu phân cách bằng IFS=' '.
caesarsol

0

Không phải với phiên bản tiêu chuẩn. Tôi có một phiên bản hack thực hiện điều đó - tôi đã sử dụng nó trước khi tôi biết về ' find ... -print0 | xargs -0 ...'. Liên hệ với tôi nếu bạn muốn có một bản sao - xem hồ sơ của tôi. (Không có khoa học tên lửa - mặc dù nó chỉ thực hiện công việc. Nó không phải là một bản sao xargs hoàn chỉnh.)


0

Điều gì về cat file | xargs | sed 's/ /\n/ig'điều này sẽ chuyển đổi không gian sang dòng mới, sử dụng các công cụ bash Linux tiêu chuẩn.


Nếu filechứa khoảng trắng và dòng mới, thì kết quả của lệnh này sẽ khiến bạn không thể phân biệt giữa chúng, dường như đang đi theo hướng ngược lại với câu hỏi này yêu cầu
Max Nanasy
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.