bọt biển từ moreutils - sự khác biệt để chuyển hướng vỏ? ví dụ hữu ích?


15
> 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   

xốp đọc đầu vào tiêu chuẩn và ghi nó ra tập tin được chỉ định. Không giống như chuyển hướng shell, bọt biển thấm tất cả đầu vào của nó trước khi ghi tệp đầu ra. Điều này cho phép xây dựng các đường ống đọc và ghi vào cùng một tệp.

Tôi không hiểu Xin vui lòng cho tôi một số ví dụ hữu ích.

Không ngâm có nghĩa là gì?



Một ví dụ khác là expand foo.txt | sponge foo.txt. Xem thêm: stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

Câu trả lời:


32

Giả sử rằng bạn có một tập tin có tên input, bạn muốn loại bỏ tất cả các dòng bắt đầu với #trong input. Bạn có thể nhận được tất cả các dòng không bắt đầu bằng #cách sử dụng:

grep -v '^#' input

Nhưng làm thế nào để bạn thay đổi input? Với công cụ POSIX tiêu chuẩn, bạn cần sử dụng một tệp tạm thời, một số thứ như:

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

Với chuyển hướng vỏ:

grep -v '^#' input >input

sẽ cắt ngắn inputtrước khi bạn đọc từ nó.

Với sponge, bạn có thể:

grep -v '^#' input | sponge input

4
Bạn thực sự có thể đọc và ghi một tệp cùng một lúc một cách an toàn miễn là các byte chỉ được chuyển đổi, sử dụng <>toán tử.
Chris Down

@ChrisDown: Vâng, ý tôi là không làm cho nó bị tập hợp
cuonglm

Tôi không chắc ý của bạn về việc "làm cho nó bị hỏng". Không giống như ><, <>không làm hỏng tập tin trừ khi có gì đó thực sự sai. Bạn có thể dễ dàng viết từng byte bằng cách sử dụng nó. Ví dụ, hãy thử sử dụng nó với tr.
Chris Down

@ChrisDown: Hãy để tôi xóa câu đó để tránh nhầm lẫn. Tôi thực sự có nghĩa là khi sử dụng <>file, bạn mở tệp để đọc và viết nhưng bạn thực sự không viết bất cứ điều gì để tập tin.
cuonglm

1
Tôi nghĩ rằng điểm mà @ChrisDown đang cố gắng thực hiện là <>nó không cắt bớt một tệp, mà chỉ thay thế các byte hiện có của nó bằng đầu ra mới. Nếu đầu ra mới quá ngắn, bạn sẽ có rác còn sót lại ở cuối tệp. Nhưng nếu đầu ra mới đủ dài, sẽ không có rủi ro.
BallpointBen

7

Các moreutils trang chủ bản thân tài liệu một trường hợp sử dụng điển hình:

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

Ở đây, / etc / passwd vừa được ghi và đọc, và đang được sửa đổi. Nếu không tạo ra stdin trước khi viết, / etc / passwd có thể bị hỏng (vì tệp đã thay đổi trong khi đọc).


Và đó sẽ là một ví dụ điển hình trên trang moreutils, nếu nó đã giải thích cách bạn đã làm :-)
Br.Bill
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.