Làm thế nào để thay thế dòng trong tập tin với mẫu bằng sed?


25

Tôi đang đọc rất nhiều tài liệu về sed, và tôi vẫn còn bối rối trong trường hợp sử dụng cụ thể của mình.

Tôi muốn thay thế dòng này trong một tệp conf bằng dòng riêng của mình:

Thay thế dòng này:

#maxmemory <byte>
với:
tối đa 26gb

Đây là những gì tôi đã cố gắng:

sed s / maxmemory. * byte. * / maxmemory 26gb / /etc/redis/redis.conf

Tôi nhận được lỗi:

sed: -e biểu thức # 1, char 30: lệnh `s 'bị hủy

Điều đó làm tôi bối rối vì tôi không biết điều đó có nghĩa là gì. Vì vậy, câu hỏi của tôi là:

Làm thế nào tôi có thể hoàn thành những gì tôi muốn? Lỗi đó có nghĩa là gì? (vì vậy tôi có thể học hỏi từ nó)

Câu trả lời:


26

Bạn đã quên -i. Sửa đổi nên được thực hiện tại chỗ:

$ sed -i 's/maxmemory.*/maxmemory 26gb/' /some/file/some/where.txt


10

Thật

Lỗi có nghĩa là trong trường hợp không có dấu ngoặc kép, shell của bạn sử dụng khoảng trắng để phân tách các đối số. Không gian giữa maxmemory26gbdo đó được coi là chấm dứt đối số đầu tiên, do đó thiếu một thiết bị đầu cuối /khi sedphân tích đối số đó là một trong các lệnh của nó.

Đặt regex của bạn giữa các dấu ngoặc đơn, để shell của bạn không chia nó thành nhiều đối số và đưa nó thành sedmột đối số duy nhất, giải quyết vấn đề:

$ sed s/maxmemory.*/maxmemory 26gb/ /some/file/some/where.txt
sed: -e expression n°1, caractère 23: commande `s' inachevée

trong khi

$ sed 's/maxmemory.*/maxmemory 26gb/' /some/file/some/where.txt

làm.

Mong rằng sẽ giúp.


1
Đó không phải sedlà điều này. Đó là cái vỏ làm được điều này.
JdeBP

bạn nói đúng, tất nhiên, cảm ơn vì đã ngẩng cao đầu :)
Sxilderik

3

Trường hợp sử dụng của bạn sẽ được giải quyết bằng lệnh này.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf

5
Có lẽ bạn muốn thêm một lời giải thích nhỏ.
davidbaumann

2
-e là cần thiết cho MacOS trong trường hợp của tôi
Cancerbero
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.