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
yasar
sumber

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
pengguna219882
sumber
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.

izidor
sumber
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
fedorqui 'JADI berhenti merugikan'
sumber
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
glenn jackman
sumber
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'

chenchuk
sumber
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.

Manlio
sumber
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