Bagaimana cara menambahkan ke akhir baris yang berisi pola dengan sed atau awk?


89

Berikut adalah contoh file:

somestuff...
all: thing otherthing
some other stuff

Yang ingin saya lakukan adalah menambahkan baris yang dimulai dengan all:seperti ini:

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

Jawaban:


168

Ini berhasil untuk saya

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

Bagian pertama adalah pola untuk dicari dan bagian kedua adalah substitusi sed biasa yang digunakan $untuk akhir baris.

Jika Anda ingin mengubah file selama proses tersebut, gunakan -iopsi

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

Atau Anda dapat mengarahkannya ke file lain

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

Hanya menambahkan sesuatu mengarah ke baris baru, mengganti adalah cara yang benar.
zhy

11

Ini seharusnya berhasil untuk Anda

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

Menggunakan perintah s (substitusi) Anda dapat mencari baris yang memenuhi ekspresi reguler. Pada perintah di atas, &singkatan dari string yang cocok.


10

Anda dapat menambahkan teks ke $0dalam awk jika sesuai dengan kondisi:

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

Penjelasan

  • /patt/ {...}jika garis cocok dengan pola yang diberikan oleh patt, maka lakukan tindakan yang dijelaskan di dalamnya {}.
  • Dalam hal ini: /^all:/ {$0=$0" anotherthing"}jika garis dimulai (diwakili oleh ^) dengan all:, maka tambahkan anotherthingke baris.
  • 1sebagai kondisi sebenarnya, memicu tindakan default awk: print the current line ( print $0). Ini akan selalu terjadi, jadi ini akan mencetak baris asli atau yang dimodifikasi.

Uji

Untuk masukan yang Anda berikan, ia mengembalikan:

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

Perhatikan, Anda juga bisa memberikan teks untuk ditambahkan dalam variabel:

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

Di Solaris, Anda akan mendapatkan error:awk: can't set $0
ceving

@ceving maka Anda dapat menggunakan /usr/xpg4/bin/awkyang merupakan awk "baik".
fedorqui 'JADI berhenti merugikan'

6

Dalam pesta:

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

6

Berikut adalah solusi sederhana lainnya menggunakan sed.

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

Penjelasan:

semua. * berarti semua baris dimulai dengan 'semua'.

& mewakili pertandingan (yaitu baris lengkap yang dimulai dengan 'semua')

lalu ganti yang pertama dengan yang terakhir dan tambahkan kata 'yang lain'


4

Solusi dengan awk:

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

Sederhananya: jika baris dimulai dengan allmencetak baris plus "anotherthing", jika tidak, cetak baris saja.


4
Anda dapat mempersingkatnya menjadi:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman

2
@Prometheus, skrip awk terdiri dari condition {actions}pasangan. Jika conditiondihilangkan, tindakan dilakukan untuk setiap record. Jika {actions}dihilangkan, dan kondisi bernilai true (yang merupakan kasus untuk nomor 1) maka tindakan default adalah mencetak record saat ini.
glenn jackman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.