Bir dosyadan bir veya daha fazla belirli satır numarasını silmek istiyorum. Sed kullanarak bunu nasıl yapabilirim?
Bir dosyadan bir veya daha fazla belirli satır numarasını silmek istiyorum. Sed kullanarak bunu nasıl yapabilirim?
Yanıtlar:
5-10 ve 12. satırları silmek istiyorsanız:
sed -e '5,10d;12d' file
Bu, sonuçları ekrana yazdırır. Sonuçları aynı dosyaya kaydetmek istiyorsanız:
sed -i.bak -e '5,10d;12d' file
Bu, dosyaya kadar yedekleme yapar file.bak
ve verilen satırları siler.
Not: Satır numaraları 1'den başlar. Dosyanın ilk satırı 0 değil 1'dir.
sed -e '5,$d' file
sed -e '5d' file
. Sözdizimi <address><command>
; burada <address>
, tek bir satır gibi 5
veya bir satır aralığı olabilir 5,10
ve komut d
verilen satırı veya satırları siler. Adresler ayrıca normal ifadeler veya $
dosyanın son satırını gösteren dolar işareti olabilir .
Belirli bir satırı satır numarasıyla silebilirsiniz.
sed -i '33d' file
Bu işlem 33 satır numarasındaki satırı siler ve güncellenen dosyayı kaydeder.
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
. Teşekkürler!
ve awk de
awk 'NR!~/^(5|10|25)$/' file
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
Bu genellikle bir antipattern belirtisidir. Satır numaralarını üreten araç, satırları hemen silen bir takımla değiştirilebilir. Örneğin;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
( deletelines
ihtiyacınız olduğunu düşündüğünüz yardımcı program nerede ) ile aynı
grep -v error logfile
Bu görevi gerçekten yerine getirmeniz gereken bir durumdaysanız sed
, satır numaraları dosyasından basit bir komut dosyası oluşturabileceğinizi söyledikten sonra. Mizahi (ama belki biraz karışıklığa) Eğer ile yapabilirsiniz sed
.
sed 's%$%d%' linenumbers
Bu, her satıra birer tane olmak üzere satır numaraları dosyasını kabul eder ve standart çıktıda d
her birine iliştirilmiş aynı satır numaralarını üretir . Bu, bir sed
dosyaya veya (bazı platformlarda) başka bir sed
örneğe kaydedebileceğimiz geçerli bir komut dosyasıdır :
sed 's%$%d%' linenumbers | sed -f - logfile
Bazı platformlarda, standart girdi anlamına sed -f
gelen seçenek bağımsız değişkenini anlamıyor -
, bu nedenle komut dosyasını geçici bir dosyaya yönlendirmeli ve işiniz bittiğinde temizlemelisiniz veya belki de yalnız tire /dev/stdin
veya /proc/$pid/fd/1
işletim sisteminizle (veya kabuğunuzla) ) vardır.
Her zaman olduğu gibi , sonucu standart çıktıda üretmek yerine hedef dosyayı yerinde düzenleme seçeneğinden -i
önce ekleyebilirsiniz . * BSDish platformlarında (OSX dahil) de açık bir argüman sağlamanız gerekir; ortak bir deyim boş bir argüman sağlamaktır; .-f
sed
-i
-i ''
p
yerine d
seçeneğiyle birlikte -n
(o olmadan iş olmaz -n
ve !d
ya çalışmaz).
Awk ile genelleme yapmak istiyorum.
Dosya sabit boyutlu bloklar tarafından oluşturulduğunda ve silinecek satırlar her blok için tekrarlandığında, awk bu şekilde düzgün çalışabilir
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
Bu örnekte blok için boyut 2000'dir ve [1..713] ve [1026..1029] satırlarını yazdırmak istiyorum.
NR
awk tarafından geçerli satır numarasını saklamak için kullanılan değişkendir.%
iki tamsayının bölünmesinin geri kalanını (veya modülünü) verir;nl=((NR-1)%BLOCKSIZE)+1
Burada nl değişkenine mevcut bloğun içindeki satır numarasını yazıyoruz . (aşağıya bakınız)||
ve &&
mantıksal operatör olan YA ve VE .print $0
tüm satırı yazarWhy ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+