Aşağıdakiler TERMINATEdosyanın sonuna kadar eşleşen satırı yazdıracaktır :
sed -n -e '/TERMINATE/,$p'
Açıklaması: -n ait devre dışı bırakır varsayılan davranışı sedüzerine onun scriptinizi sonra her satırı baskı, -eiçin bir komut dosyası belirtilen sed, /TERMINATE/,$eşleştirme ilk satırı anlam bir adres (çizgi) aralığı seçim olduğunu TERMINATE(Dosyanın sonuna (grep gibi) düzenli ifade $) , ve pgeçerli satırı yazdıran yazdırma komutudur.
Bu, eşleşen çizgiyi izleyen satırdan TERMINATEdosyanın sonuna kadar yazdırılır :
(eşleşen çizgiden SONRA, eşleşen çizgi dahil DEĞİL, EOF'a)
sed -e '1,/TERMINATE/d'
Explained: normal ifadeyle 1,/TERMINATE/eşleşen 1. satıra giriş için ilk satır anlamına gelen bir adres (satır) aralığı seçimidir ve geçerli satırı silen ve sonraki satıra atlayan delete komutudur. Gibi varsayılan davranış çizgilerini yazdırmak için, o sonra çizgileri yazdırır girişin sonuna kadar.TERMINATEdsedTERMINATE
Düzenle:
Daha önce hatları istiyorsanız TERMINATE:
sed -e '/TERMINATE/,$d'
Ve her iki satırı TERMINATEtek bir geçişte 2 farklı dosyada önce ve sonra istiyorsanız :
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
Önceki ve sonraki dosyalar sonlandırılan satırı içerecektir, bu nedenle her birini işlemek için kullanmanız gerekir:
head -n -1 before
tail -n +2 after
Edit2:
Sed komut dosyasındaki dosya adlarını sabit kodlamak istemiyorsanız, şunları yapabilirsiniz:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
Ama sonra $son satırın anlamından kaçmak zorundasınız, böylece kabuk $wdeğişkeni genişletmeye çalışmaz (artık tek tırnak yerine kodun etrafında çift tırnak kullandığımızı unutmayın).
Yeni satırın koddaki dosya adlarından sonra önemli olduğunu söylemeyi unuttum, böylece sed dosya adlarının sona erdiğini biliyor.
Düzenleme: 2016-0530
Sébastien Clément sordu: "Donanım kodunu TERMINATEbir değişkenle nasıl değiştirirdiniz ?"
Eşleşen metin için bir değişken yapar ve bunu önceki örnekle aynı şekilde yaparsınız:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
önceki örneklerle eşleşen metin için bir değişken kullanmak için:
## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"
Bu durumlarda metnin değişkenlerle değiştirilmesiyle ilgili önemli noktalar şunlardır:
- [ ] İçine
$variablenamealınmış değişkenler ( ) "genişlemez", ancak [ ] içindeki değişkenler genişler . Yani, değiştirmek zorunda tüm için onlar metin içeren eğer bir değişkenle değiştirmek istiyor. single quotes'double quotes"single quotesdouble quotes
sedAralıklar da içeren $ve hemen gibi bir harf ile takip edilmektedir: $p, $d, $w. O kaçmak zorunda Onlar da, genişletilecek değişkenler gibi görünecek $ters eğik çizgi [karakterleri \gibi]: \$p, \$d, \$w.
grep 'TERMINATE' file