Xargs yang dipisahkan baris baru

41

Apakah mungkin hanyaxargs menggunakan baris baru sebagai pemisah? (dalam bash di Linux dan OS X jika itu penting)

Saya tahu -0dapat digunakan, tapi itu PITA karena tidak setiap perintah mendukung keluaran dibatasi-NUL.

Kornel
sumber
Apa yang ingin Anda capai. Mungkin ada cara lain untuk melakukannya.
Dijeda sampai pemberitahuan lebih lanjut.
@ Dennis Saya menggunakannya untuk berbagai hal, sering dalam pipa dengan grep, sed, awk dll, sebagian besar untuk memparalelkan eksekusi. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4terlalu banyak untuk diketik dibandingkan dengan ls *.foo | xargs -P4.
Kornel
Script dan fungsi adalah dua cara terbaik untuk mengurangi pengetikan.
Dijeda sampai pemberitahuan lebih lanjut.
Ini pertanyaan SO, bukan?
Charles Stewart

Jawaban:

17

Sesuatu di sepanjang garis

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

harus bekerja.

hurfdurf
sumber
38
tr '\n' '\0'bekerja juga.
Kornel
2
perl berlebihan untuk satu karakter. trlebih cepat untuk cpu dan untuk jari Anda.
Hello World
53

GNU xargs (default di Linux; instal findutilsdari MacPorts di OS X untuk mendapatkannya) mendukung -dyang memungkinkan Anda menentukan pembatas khusus untuk input, sehingga Anda dapat melakukan

ls *foo | xargs -d '\n' -P4 foo 
James
sumber
Saya miliki alias xxargs="xargs -d '\n'"di bashrc saya. Jadi saya bisa melakukan hal-hal seperti ini:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl
4
Ini benar-benar harus menjadi jawaban yang diterima. Tidak perlu keluar perl. Padahal tritu ide yang bagus juga.
Ehtesh Choudhury
3
brew install findutilsdan gxargspersis apa yang saya butuhkan di OS X, terima kasih.
Brad Koch
5

Dengan Bash, saya biasanya lebih suka menghindari xargs untuk apa pun yang paling sulit, demi loop sambil membaca. Untuk pertanyaan Anda, while read -ar LINE; do ...; doneapakah pekerjaan (ingat untuk menggunakan sintaks array dengan LINE, misalnya, ${LINE[@]}untuk seluruh baris). Ini tidak memerlukan tipuan: secara default penggunaan baca hanya \nsebagai karakter terminator garis.

Saya harus memposting pertanyaan di SO tentang pro & kontra dari loop xargs sambil membaca ... selesai!

Charles Stewart
sumber
2
Ini hanya bisa ditiru xargs -n1 -d'\n', dan tidak keseluruhan xargs.
Hello World
@ HaloWorld - Anda dapat mengelompokkan argumen dengan cukup mudah, sehingga Anda dapat mensimulasikan xargs -n$Njuga dengan hanya sedikit skrip tambahan.
Charles Stewart
Ya, saya termasuk di antara para upvoters, hanya komentar yang layak disebut.
Hello World
Inilah yang saya lakukan! Plus, Anda dapat menggunakan readopsi, seperti membaca lebih banyak kata dalam variabel terpisah, atau mengubah pembatas dengan IFS=' '.
caesarsol
0

Tidak dengan versi standar. Saya memiliki versi yang diretas yang melakukan itu - saya menggunakannya sebelum saya tahu tentang ' find ... -print0 | xargs -0 ...'. Hubungi saya jika Anda ingin salinannya - lihat profil saya. (Tidak ada ilmu roket - hanya tentang melakukan pekerjaan, meskipun. Ini bukan replika xargs lengkap.)

Jonathan Leffler
sumber
0

Bagaimana dengan cat file | xargs | sed 's/ /\n/ig'ini akan mengkonversi spasi menjadi baris baru, menggunakan alat bash Linux standar.

Omar Al-Ithawi
sumber
Jika fileberisi spasi dan baris baru, maka hasil dari perintah ini akan membuat tidak mungkin untuk membedakan di antara mereka, yang tampaknya berjalan berlawanan arah dengan apa yang ditanyakan oleh pertanyaan ini
Max Nanasy