Làm cách nào để thêm vào cuối các dòng có chứa mẫu bằng sed hoặc awk?


89

Đây là tệp ví dụ:

somestuff...
all: thing otherthing
some other stuff

Những gì tôi muốn làm là thêm vào dòng bắt đầu bằng all:như thế này:

somestuff...
all: thing otherthing anotherthing
some other stuff

Câu trả lời:


166

Điều này phù hợp với tôi

sed '/^all:/ s/$/ anotherthing/' file

Phần đầu tiên là một mẫu để tìm và phần thứ hai là một sự thay thế của sed thông thường sử dụng $cho cuối dòng.

Nếu bạn muốn thay đổi tệp trong quá trình này, hãy sử dụng -itùy chọn

sed -i '/^all:/ s/$/ anotherthing/' file

Hoặc bạn có thể chuyển hướng nó đến một tệp khác

sed '/^all:/ s/$/ anotherthing/' file > output

Chỉ cần thêm một cái gì đó dẫn đến một dòng mới, thay thế là một cách đúng đắn.
zhy

10

Điều này sẽ làm việc cho bạn

sed -e 's_^all: .*_& anotherthing_'

Sử dụng lệnh s (thay thế), bạn có thể tìm kiếm một dòng thỏa mãn một biểu thức chính quy. Trong lệnh trên, &là viết tắt của chuỗi được so khớp.


9

Bạn có thể nối văn bản $0vào awk nếu nó phù hợp với điều kiện:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

Giải trình

  • /patt/ {...}nếu dòng khớp với mẫu được cung cấp bởi patt, hãy thực hiện các hành động được mô tả bên trong {}.
  • Trong trường hợp này: /^all:/ {$0=$0" anotherthing"}nếu dòng bắt đầu (được biểu thị bằng ^) bằng all:, thì nối thêm anotherthingvào dòng.
  • 1như một điều kiện đúng, kích hoạt hành động mặc định awk: in dòng hiện tại ( print $0). Điều này sẽ luôn xảy ra, vì vậy nó sẽ in dòng gốc hoặc dòng đã sửa đổi.

Kiểm tra

Đối với đầu vào đã cho của bạn, nó trả về:

somestuff...
all: thing otherthing anotherthing
some other stuff

Lưu ý rằng bạn cũng có thể cung cấp văn bản để thêm vào một biến:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

Trên Solaris, bạn sẽ gặp lỗi:awk: can't set $0
ngừng hoạt động

@ceving thì bạn có thể sử dụng /usr/xpg4/bin/awkawk "tốt".
fedorqui 'SO dừng hại'

6

Trong bash:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename

6

Đây là một giải pháp đơn giản khác bằng cách sử dụng sed.

$ sed -i 's/all.*/& anotherthing/g' filename.txt

Giải trình:

tất cả. * có nghĩa là tất cả các dòng bắt đầu bằng 'tất cả'.

& đại diện cho trận đấu (nghĩa là dòng hoàn chỉnh bắt đầu bằng 'tất cả')

sau đó sed thay thế cái trước bằng cái sau và thêm vào từ 'anotherthing'


3

Giải pháp với awk:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

Đơn giản: nếu hàng bắt đầu bằng allin hàng cộng với "cái khác", thì chỉ in hàng đó.


4
Bạn có thể rút ngắn thời đó để:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn Jackman

2
@Prometheus, một tập lệnh awk bao gồm các condition {actions}cặp. Nếu conditionbỏ qua, các hành động được thực hiện cho mọi bản ghi. Nếu giá trị {actions}bị bỏ qua và điều kiện đánh giá là true (trường hợp của số 1) thì hành động mặc định là in bản ghi hiện tại.
glenn jackman
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.