Aşağıdakiler TERMINATE
dosyanı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ı, -e
iç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 p
geçerli satırı yazdıran yazdırma komutudur.
Bu, eşleşen çizgiyi izleyen satırdan TERMINATE
dosyanı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.TERMINATE
d
sed
TERMINATE
Düzenle:
Daha önce hatları istiyorsanız TERMINATE
:
sed -e '/TERMINATE/,$d'
Ve her iki satırı TERMINATE
tek 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 $w
değ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 TERMINATE
bir 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
$variablename
alı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 quotes
double quotes
sed
Aralı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