ขึ้นบรรทัดใหม่คั่น xargs


40

เป็นไปได้ไหมที่จะxargsใช้newline เป็นตัวคั่นเท่านั้น ? (ในทุบตีบน Linux และ OS X หากเรื่องนั้น)

ฉันรู้ว่า-0สามารถใช้งานได้ แต่มันเป็น PITA เนื่องจากไม่ใช่ทุกคำสั่งรองรับเอาต์พุตที่คั่นด้วย NUL


คุณพยายามทำอะไรให้สำเร็จ อาจมีวิธีอื่นที่จะไปเกี่ยวกับเรื่องนี้
Dennis Williamson

@ เดนนิสฉันใช้มันสำหรับสิ่งต่าง ๆ บ่อยครั้งในการส่งด้วย grep, sed, awk ขั้นพื้นฐาน ฯลฯ ซึ่งส่วนใหญ่จะขนานกันในการประมวลผล เป็นวิธีที่มากเกินไปที่จะพิมพ์เมื่อเทียบกับfind -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4 ls *.foo | xargs -P4
Kornel

สคริปต์และฟังก์ชั่นเป็นสองวิธีที่ยอดเยี่ยมในการลดการพิมพ์
Dennis Williamson

นี่เป็นคำถาม SO ใช่ไหม?
Charles Stewart

คำตอบ:


17

บางสิ่งบางอย่างตามแนวของ

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

ควรทำงาน.


38
tr '\n' '\0'ทำงานเกินไป
Kornel

2
Perl คือ overkill สำหรับตัวละครตัวเดียว trเร็วกว่าทั้งสำหรับซีพียูและนิ้วของคุณ
สวัสดีชาวโลก

52

GNU xargs (ค่าเริ่มต้นบน Linux ติดตั้งfindutilsจาก MacPorts บน OS X เพื่อรับมัน) รองรับ-dซึ่งให้คุณระบุตัวคั่นที่กำหนดเองสำหรับอินพุตดังนั้นคุณสามารถทำได้

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

ฉันมีalias xxargs="xargs -d '\n'"ใน bashrc ของฉัน ดังนั้นฉันสามารถทำสิ่งนี้ได้:grep -IRl foo | xxargs sed -i s/foo/bar/g
ไทเลอร์

4
นี่ควรเป็นคำตอบที่ยอมรับได้จริง ๆ ไม่จำเป็นต้องทะลึ่งออกมา แม้ว่าtrจะเป็นความคิดที่ดีเช่นกัน
Ehtesh Choudhury

3
brew install findutilsและgxargsเป็นสิ่งที่ฉันต้องการใน OS X ขอบคุณ
แบรดโคช์

5

ด้วย Bash ฉันมักจะชอบที่จะหลีกเลี่ยง xargs สำหรับสิ่งใดก็ตามที่มีความยุ่งยากน้อยที่สุด สำหรับคำถามของคุณwhile read -ar LINE; do ...; doneทำงาน (อย่าลืมใช้ไวยากรณ์อาร์เรย์กับ LINE เช่น${LINE[@]}สำหรับทั้งบรรทัด) สิ่งนี้ไม่จำเป็นต้องใช้เล่ห์เหลี่ยมใด ๆ : โดยค่าเริ่มต้นการอ่านใช้\nเช่นเดียวกับตัวอักษรที่จุดสิ้นสุดบรรทัด

ฉันควรโพสต์คำถามเกี่ยวกับข้อดีข้อเสียของ xargs เทียบกับขณะอ่านลูป ... เสร็จแล้ว!


2
นี้สามารถเลียนแบบและไม่ทั้งหมดxargs -n1 -d'\n' xargs
สวัสดีชาวโลก

@HelloWorld - คุณสามารถรวมอาร์กิวเมนต์เข้าด้วยกันได้ง่ายพอดังนั้นคุณสามารถจำลองได้xargs -n$Nเช่นกันด้วยการเพิ่มสคริปต์เพียงเล็กน้อย
Charles Stewart

ใช่ฉันเป็นหนึ่งในกลุ่มผู้ต่อต้านมันเป็นเพียงคำพูดที่ควรค่าแก่การกล่าวขวัญ
สวัสดีชาวโลก

นี่คือสิ่งที่ฉันทำ! นอกจากนี้คุณยังสามารถใช้readตัวเลือกเช่นการอ่านคำอื่น ๆ IFS=' 'ในตัวแปรที่แยกจากกันหรือการเปลี่ยนแปลงตัวคั่นด้วย
caesarsol

0

ไม่ได้อยู่ในรุ่นมาตรฐาน ฉันมีแฮ็คเวอร์ชันที่ทำเช่นนั้น - ฉันใช้ก่อนที่ฉันจะรู้เกี่ยวกับ ' find ... -print0 | xargs -0 ...' ติดต่อฉันหากคุณต้องการสำเนา - ดูโปรไฟล์ของฉัน (ไม่มีจรวดวิทยาศาสตร์ - มันเกี่ยวกับการทำงาน แต่มันไม่ใช่แบบจำลอง xargs ที่สมบูรณ์)


0

สิ่งcat file | xargs | sed 's/ /\n/ig'นี้จะแปลงช่องว่างเป็นบรรทัดใหม่โดยใช้เครื่องมือทุบตี Linux มาตรฐาน


หากfileมีช่องว่างและบรรทัดใหม่ผลลัพธ์ของคำสั่งนี้จะทำให้แยกแยะไม่ออกซึ่งดูเหมือนจะเป็นไปในทิศทางตรงกันข้ามกับสิ่งที่คำถามนี้ถาม
Max Nanasy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.