Sed veya awk ile desen içeren satırların sonuna nasıl eklenir?


89

İşte örnek dosya:

somestuff...
all: thing otherthing
some other stuff

Yapmak istediğim şey şu şekilde başlayan satıra eklemek all::

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

Yanıtlar:


168

Bu benim için çalışıyor

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

İlk bölüm, bulmak için bir modeldir ve ikinci bölüm, $bir satırın sonu için kullanılan sıradan bir sed ikamesidir .

İşlem sırasında dosyayı değiştirmek isterseniz, -iseçeneği kullanın

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

Veya başka bir dosyaya yönlendirebilirsiniz

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

Sadece bir şey eklemek yeni bir satıra yol açar, değiştirmek doğru yoldur.
zhy

11

Bu senin için çalışmalı

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

S komutunu (ikame) kullanarak normal bir ifadeyi karşılayan bir satırı arayabilirsiniz. Yukarıdaki komutta &, eşleşen dizeyi temsil eder.


10

Metni $0, koşula uyuyorsa, awk olarak ekleyebilirsiniz :

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

Açıklama

  • /patt/ {...}çizgi, tarafından verilen desenle eşleşiyorsa, pattiçinde açıklanan işlemleri gerçekleştirin {}.
  • Bu durumda: /^all:/ {$0=$0" anotherthing"}eğer satır ile başlıyorsa (ile temsil edilirse ^) all:, o zaman anotherthingsatıra ekleyin .
  • 1gerçek bir koşul olarak, şu varsayılan eylemi tetikler awk: geçerli satırı yazdır ( print $0). Bu her zaman olacak, dolayısıyla ya orijinal satırı ya da değiştirilmiş olanı yazdıracaktır.

Ölçek

Verdiğiniz giriş için şu değeri döndürür:

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

Bir değişkene eklenecek metni de sağlayabileceğinizi unutmayın:

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

Solaris'te şu hatayı alacaksınız:awk: can't set $0
2016 17

@ceving sonra /usr/xpg4/bin/awkhangisinin "iyi" olduğunu kullanabilirsiniz awk.
fedorqui

6

Bash'de:

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

6

İşte sed kullanarak başka bir basit çözüm.

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

Açıklama:

tümü. * tüm satırların "tümü" ile başladığı anlamına gelir.

& eşleşmeyi temsil eder (yani 'tümü' ile başlayan tam satır)

daha sonra sed eskisini daha sonra ile değiştirir ve 'başka bir şey' kelimesini ekler


4

Awk ile çözüm:

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

Basitçe: Satır all, satır artı "başka bir şey" ile başlıyorsa , yalnızca satırı yazdırın.


4
Bunu şu şekilde kısaltabilirsiniz:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman

2
@Prometheus, bir awk betiği condition {actions}çiftlerden oluşur . Eğer conditionatlanırsa, eylemler her kayıt için yapılmaktadır. Eğer {actions}ihmal ve koşul olarak değerlendirilirse olan gerçek (sayısı için durum olan 1) daha sonra varsayılan eylem geçerli kaydı yazdırmaktır.
glenn jackman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.