ฟองน้ำจาก moreutils - ความแตกต่างในการเปลี่ยนเส้นทางของเชลล์คืออะไร ตัวอย่างที่มีประโยชน์


16
> brew install moreutils                                                          
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz    
######################################################################## 100.0%               
==> Pouring moreutils0.55.yosemite.bottle.tar.gz       
🍺  /usr/local/Cellar/moreutils/0.55: 67 files, 740K   

ฟองน้ำอ่านอินพุตมาตรฐานและเขียนมันออกไปยังไฟล์ที่ระบุ แตกต่างจากการเปลี่ยนเส้นทางของเชลล์ฟองน้ำดูดซับอินพุตทั้งหมดก่อนที่จะเขียนไฟล์เอาต์พุต สิ่งนี้อนุญาตให้สร้างท่อที่อ่านและเขียนไปยังไฟล์เดียวกัน

ฉันไม่เข้าใจ โปรดยกตัวอย่างที่มีประโยชน์ให้ฉัน

การดูดซับหมายถึงอะไร



expand foo.txt | sponge foo.txtอีกตัวอย่างหนึ่งคือ ดูเพิ่มเติมที่: stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

tl; dr sponge"ดูดซับ" อินพุตก่อนตัดทอนไฟล์เอาต์พุต
BallpointBen

คำตอบ:


33

สมมติว่าคุณมีไฟล์ชื่อinputที่คุณต้องการที่จะลบเส้นเริ่มต้นทั้งหมดที่มีใน# inputคุณสามารถทำให้ทุกบรรทัดไม่ขึ้นต้นด้วยการ#ใช้:

grep -v '^#' input

แต่คุณจะเปลี่ยนแปลงinputอย่างไร ด้วย POSIX toolchest มาตรฐานคุณต้องใช้ไฟล์ชั่วคราวบางสิ่งเช่น:

grep -v '^#' input >/tmp/input.tmp
mv /tmp/input.tmp ./input

ด้วยการเปลี่ยนเส้นทางเชลล์:

grep -v '^#' input >input

จะตัดทอนinputก่อนที่คุณจะอ่าน

ด้วยspongeคุณสามารถ:

grep -v '^#' input | sponge input

4
คุณสามารถอ่านและเขียนไฟล์ในเวลาเดียวกันได้อย่างปลอดภัยตราบเท่าที่ไบต์จะถูกแปลงเท่านั้นโดยใช้<>โอเปอเรเตอร์
Chris Down

@ChrisDown: ใช่ฉันหมายถึงโดยไม่ทำให้มันเป็นปัญหา
cuonglm

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร "ทำให้เสียหาย" ซึ่งแตกต่างจาก>และ<, <>ไม่เสียหายไฟล์เว้นแต่สิ่งที่ผิดพลาดจริงๆ คุณสามารถเขียน byte byte ได้อย่างง่ายดาย trตัวอย่างเช่นลองใช้กับ
Chris Down

@ChrisDown: ให้ฉันลบประโยคนั้นเพื่อหลีกเลี่ยงความสับสน ฉันหมายถึงเวลาใช้<>fileคุณเปิดไฟล์เพื่ออ่านและเขียน แต่คุณไม่ได้เขียนอะไรลงไฟล์เลย
cuonglm

1
ฉันคิดว่าจุดที่ @ChrisDown พยายามทำคือ<>ไม่ตัดทอนไฟล์ แต่เพียงแทนที่ไบต์ที่มีอยู่ด้วยเอาต์พุตใหม่ หากผลลัพธ์ใหม่สั้นเกินไปคุณจะมีขยะเหลืออยู่ท้ายไฟล์ แต่ถ้าผลผลิตใหม่นานพอก็ไม่มีความเสี่ยง
BallpointBen

8

หน้าแรก moreutilsตัวเองเอกสารกรณีการใช้งานทั่วไป:

sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd

นี่ / etc / passwd ถูกเขียนและอ่านและกำลังถูกแก้ไข หากไม่มีการเพิ่ม stdin ก่อนที่จะเขียน / etc / passwd อาจเสียหาย (เนื่องจากไฟล์มีการเปลี่ยนแปลงระหว่างการอ่าน)


และนั่นจะเป็นตัวอย่างที่ดีในหน้า moreutils ถ้ามันได้อธิบายวิธีที่คุณทำ :-)
Br.Bill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.