Làm thế nào để thay thế toàn bộ một dòng với sed?


132

Giả sử tôi có một tập tin với các dòng

aaa = bbb

Bây giờ tôi muốn thay thế chúng bằng:

aaa = xxx

Tôi có thể làm như sau:

sed "s / aaa = bbb / aaa = xxx / g"

Bây giờ tôi có một tập tin với một vài dòng như sau:

aaa = bbb
aaa = ccc
aaa = ddd
aaa = [cái gì khác]

Làm thế nào tôi có thể thay thế tất cả các dòng này aaa=[something]bằng aaa=xxxcách sử dụng sed ?


2
[something else]văn bản theo nghĩa đen, hoặc đó chỉ là một giữ chỗ? Định dạng có thể của sự vật sau dấu bằng là gì?
ean5533

đó là nhiều hơn một câu hỏi regex không phải là một câu hỏi sed.
an toàn hơn

Câu trả lời:


217

Thử cái này:

sed "s/aaa=.*/aaa=xxx/g"

4
Có thể bỏ qua thói quen này trong trường hợp này - nó được sử dụng như một sự thay thế toàn cầu cho dòng để thay thế cho mỗi trận đấu thay vì chỉ là trận đấu đầu tiên. Trong trường hợp này mặc dù chỉ có cái đầu tiên sẽ được khớp vì .*.
John Doyle

1
Michael J. Barber, gthay thế tất cả các ví dụ của regrec bằng thay thế
A-IV

116

Bạn cũng có thể sử dụng dòng thay đổi của sed để thực hiện điều này:

sed -i "/aaa=/c\aaa=xxx" your_file_here

Điều này sẽ đi qua và tìm thấy bất kỳ dòng nào vượt qua aaa=bài kiểm tra, có nghĩa là dòng chứa các chữ cái aaa=. Sau đó, nó thay thế toàn bộ dòng bằng aaa = xxx. Bạn có thể thêm một ^điểm vào đầu bài kiểm tra để đảm bảo bạn chỉ nhận được các dòng bắt đầu aaa=nhưng điều đó tùy thuộc vào bạn.


12
Yêu sedcầu của OS X phải cđược theo sau bằng dấu gạch chéo ngược và dòng mới và nó không nối thêm dòng mới vào văn bản được chèn, nhưng bạn có thể sử dụng ví dụ $'/aaa=/c\\\naaa=xxx\n'.
Lri

Dưới đây và ví dụ trong tài liệu sed về tính năng thay đổi / thay thế mà @Mr. T đang nói về.
gen_wood

Đây là cách gần nhất để thực sự làm những gì được yêu cầu ... (Nhưng phiên bản của Lri là cần thiết cho tính di động)
Gert van den Berg

42

Như thế này:

sed 's/aaa=.*/aaa=xxx/'

Nếu bạn muốn đảm bảo rằng đó aaa=là ở đầu dòng, hãy thực hiện:

sed 's/^aaa=.*/aaa=xxx/'

1
Nếu tôi muốn thay thế bằng aaa = 'xxxx' thì sao. Tôi đã cố gắng trốn thoát như thế sed 's/aaa=.*/aaa=\'xxx\'/'nhưng điều đó mở ra một >dấu nhắc trong một dòng mới ...
Nagev 21/03/18

2

Nếu bạn muốn sử dụng awkthì nó cũng hoạt động

awk -F= '{$2="xxx";print}' OFS="\=" filename


0

Điều này có thể làm việc cho bạn:

cat <<! | sed '/aaa=\(bbb\|ccc\|ddd\)/!s/\(aaa=\).*/\1xxx/'
> aaa=bbb
> aaa=ccc
> aaa=ddd
> aaa=[something else]
!
aaa=bbb
aaa=ccc
aaa=ddd
aaa=xxx

Tôi không nghĩ rằng một kiểm tra rõ ràng cho bbb, cccdddkhá gì OP đã có trong tâm trí.
spinup
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.