# İle başlayan tüm satırları dosyadan sil


182

Bir dosyada yorum içeren tüm satırlar ile başlar #. İle başlayan tüm satırları (ve yalnızca bu satırları) nasıl silebilirim #? #Satırın başında yer alan, ancak başında olmayan diğer satırlar yok sayılmalıdır.


1
#blah \<nl>blahTers eğik çizgi yeni satırdan kaçtığından, tek bir "mantıksal çizgi" olarak sayılan ortak sözleşmeyle çalışmak zorunda mı ?
sarnold

@sarnold: Bunun dışında make, hangi yardımcı programlar 'bir yorumu sonlandırmadan önce ters eğik çizgi ek satırlarını kullanıyor'? Kabuklar (bash ve ksh test edildi) yapmıyor. C ve C ++, önişlemci yönergelerinin diğer işlemlerinden önce yeni satır ekleme işlemlerini gerçekleştirir, ancak yorumlar yerine yönergelerdir.
Jonathan Leffler

@Jonathan: Harika. Ortak \<nl>kaçmanın yorumlarda da işe yarayacağını varsaymıştım . Ama vay be yanılmışım. Henüz başka bir örnek bulamadım ... :) Teşekkürler!
31'de sarnold

Yanıtlar:


302

Bu bir sed tek astar ile yapılabilir :

sed '/^#/d'

Bu, "# ile başlayan tüm satırları bul ve sil, diğer her şeyi bırak."


9
daha kısa versiyon:sed /^#/d
kev

80
Benim gibi linux noobs için:sed '/^#/ d' < inputFile.txt > outputFile.txt
Neil McGuigan

50
En kısa versiyon: sed -i '/^#/d' filepath.
lesderid

14
Ve sed -i '' '/^#/d' filepathMac'te ( -i soneki zorunlu olduğu için )
paulcm

1
@Viesturs Şunu deneyin:awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger

56

Kimsenin en belirgin çözümü önermediğine biraz şaşırdım:

grep -v '^#' filename

Bu, sorunu belirtildiği gibi çözer.

Ancak, ortak bir kuralın #bir satırın sonuna kadar her şeyin yorum olarak ele alınacağına dikkat edin:

sed 's/#.*$//' filename

ancak bu, örneğin, #dizgi değişmezindeki bir karakteri bir yorumun başlangıcı olarak ele alır (sizin durumunuzla alakalı olabilir veya olmayabilir) (ve boş satırlar bırakır).

Rasgele boşluk ile başlayan ve ardından gelen bir satır #da yorum olarak değerlendirilebilir:

grep -v '^ *#' filename

boşluk yalnızca boşluksa veya

grep -v '^[  ]#' filename

burada iki boşluk bir boşluk ve ardından değişmez bir sekme karakteri ("control-v sekmesi" yazın).

Tüm bu komutlar için, filenamestandart girdiden (örn. Bir borunun parçası olarak) okunacak argümanı atlayın .


Bu cevabı temel alan yeni bir cevap ekledim .
Acumenus

Windows'da bu şekilde grep kullanmayla ilgili sorunlar yaşadım. Çözüm, 'by' ile yer değiştirmektir, örn.grep -v "^#" filename
Serg

14

Raymond'un çözümünün tersi:

sed -n '/^#/!p'

"# ile başlamayan satırlar dışında hiçbir şey yazdırmayın"


9

ile dosyanızı doğrudan düzenleyebilirsiniz

sed -i '/^#/ d'

Bazı boşluk kullanımıyla başlayan yorum satırlarını da silmek istiyorsanız

sed -i '/^\s*#/ d'

Genellikle, komut dosyanızın ilk satırını bir sha-bang ise tutmak istersiniz, bu nedenle sedile başlayan satırları silmemelisiniz #!. Ayrıca, yalnızca bir karma içeren ancak metin içermeyen satırları silmelidir. hepsini bir araya getirmek:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

Tüm sed varyantlarına uymak için, -iseçeneğe bir yedek uzantı eklemeniz gerekir :

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

1
artı 1 hangi alan için
deepaksingh pawar

7

Awk çözümü için aşağıdakileri kullanabilirsiniz -

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile


-3

İşte bazı uzantıya sahip tüm dosyalar için bir döngü ile:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
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.