Bir dosyayı nasıl “cat” edebilir ve yorumlanmış satırları nasıl kaldırabilirim?


29

Gibi başlayan ve tüm satırları kaldırmak catgibi bir dosya olup olmadığını bilmek istiyorumphp.ini;

Örneğin, eğer dosya bunu içeriyorsa:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

ve doğru komutu koştum cat | {remove comments command}, sonra şunu bırakacağım:

error_reporting  =  E_ALL & ~E_NOTICE

Not - Ben farz catBunu yapmanın en iyi yolu olacağını fakat bunun başka bir yardımcı programını kullanarak cevap aslında iyiyim awk, sed, egrepvb


Peki ya böyle bir şey error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? Bu durumda yorum da kaldırılmalı mı?
CV:

@ MichaelKjörling - Yorumların kaldırılmasından başlayarak sadece satırlar konusunda gerçekten iyiyim
cwd

1
catdosyaları birleştirmek için bir araçtır. grepdesenleri temel alan çizgileri filtrelemek için kullanılan araçtır. sedve awkbu satırları da değiştirebilir.
Stéphane Chazelas

Yanıtlar:



25

Bir dosyayı grep aracılığıyla yönlendirmeniz gerekmez, grep komut satırında dosya adlarını alır.

grep -v '^#' file1 file2 file3

tüm satırları yazdıracaktır. Bir # char ile başlayanları hariç. Yorum çizelgesini dilediğiniz şekilde değiştirebilirsiniz.

Birden fazla yorum yazıcınız varsa (satırın başında varsayarsak)

egrep -v '^(;|#|//)' filelist

2
Yaptığım bir başkası hep yanımda kaldı grep '^[^;]' filename. Yine de taşınabilirliği ile konuşamam!
Jodie C

@JodieC, taşınabilir ancak boş satırları da kaldırır (Bu genellikle istenir). Standart eşdeğer egrepolan grep -E. Bir de kullanabilirsinizgrep -ve '^[;#]' -e '^//'
Stéphane Chazelas

9

egrepkullanımınızı kurtarabilir cat. Diğer bir deyişle, (daha az işlem oluşturabilir egrepvs cat+ egrep) ve (boruyu daha az tampon kullanmak catiçin egrepbir boru vs.).

catBir dosyayı yalnızca kendi başına okuyabilen bir komuta geçirmek istiyorsanız , kullanımının sınırlandırılması genellikle iyi bir fikirdir .

Bununla birlikte, aşağıdaki komut boşluk veya sekme girintisi olsa bile yorumları kaldıracaktır:

egrep -v '^ [[: blank:]] *;' file.ini

En yeni [[ karakter sınıfı ]] regex biçimini, egrepen az on yıl boyunca kullanımdan kaldırılmış komutun kullanımıyla birleştirmeniz komik .
mikeserv 13.03.2014

İlginç ... gnu.org/software/grep/manual/html_node/… adresindeki güncel dokümanlar POSIX sınıflarını içerir.
Jack Wasey

7
egrep -v '^;|^$' $file

';' ile başlayan satırları ve boş satırları hariç tutacaktır.

regex'te, ^bir satırın başlangıcını ve bir satırın $sonunu ^$belirtir , bu nedenle satır karakterinin başlangıcı ve satır karakterinin bitişiğinin hemen yanında olduğu satırları belirtir.


öyleyse, eğer bu hakkı okuyorsam, bu yorumlanan satırları kaldırabilir, fakat ayrıca boş satırları da kaldırabilir
cwd

1
@cwd Evet. İkisini de neden dahil ettiğinden emin değilim, ancak yalnızca yorumlanmış satırları kaldırmak istiyorsanız sadece kullanınegrep -v '^;'
Michael Mrozek

4
egrep de dosyaları sever (daha az işlem ve arabellek kullanılır) ve küçük bir bonus da girintili yorumları da kaldırmaktır:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
"İşe yaramaz kedi kullanımı" rozeti lazım.
Simon Richter

@nrolans - popüler bir yoruma benziyor, neden cevap vermiyorsun?
cwd

2

Basit awkbir tek gömlek awk '/^;/{next}1' input_filehile yapmak gerekir.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
Doğru, ama ayrıntılı. Sadece awk '!/^;/' input_fileyeter.
Manatwork

2

Jaypal'ın yanı sıra, muhtemelen awkbu amaçlar için kullanırım . Perl'nin bu tür amaçlar için bazen oldukça kullanışlı olduğunu söylemek daha da kötü:

cat data.txt | perl -lne "print unless /^;/"

Perl regexps awk ile karşılaştırıldığında daha güçlü ve bazen onlara ihtiyacınız olabilir.


Perl için +1, kedi ve -l her ikisinin de gereksiz olmasına rağmen, daha basit bir çağrıperl -ne 'print unless /^;/' data.txt
Simon Whitaker

@Simone Whitaker, evet, haklısınız - bu benim yazdığım şekilde yazmak bir alışkanlık ve bundan bahsetmeye değer.
shabunc

1
Tabi ki. Aslında, catdaha genel "STDOUT'da metin üreten herhangi bir şey" için bir vekil olarak değerlendirirseniz, bu örneklerde işe yaradığını düşünüyorum . Unix borular dilimlenmiş ekmeklerden beri en iyisidir. :)
Simon Whitaker,

2

@ Shabunc'ın cevabına dair ayrıntılı bir açıklama, bu yorum yazmak için satır içi (satır içi yorumlar dahil), ardından boşluktan başka bir şey içeren tüm satırları yazdırmak için Perl kullanır.

$ perl -ne 's/;.*//; print if /\S/' data.txt

Açıklama:

  • s/;.*//noktalı s/<regex>/<replacement>/virgül örneklerini ve ardından gelen her şeyi boş dize ile değiştirmek için yerine koyma işlecini ( ) kullanır .
  • print if /\S/tüm boşluk olmayan karakterlerle eşleşen \Sbir karakter sınıfı olan regexp ile eşleşirse satırı yazdırır .

1

İşte kullandığım bir, sadece ';' yorum karakteriyle (örneğin, birçok UNIX hizmeti yapılandırma dosyası için '#' ile):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

Tüm çizgi yorumlarından (öncü boşluklara sahip olsalar bile) ve yorum dışı satırları sonlandıran tüm yorumlardan kurtulur ve boş satırları çıktıdan tamamen kaldırır. Bu, boru hattı olmadan mümkün olabilir (benim başım ya da awk-fu'm kuşkusuz büyük değil), ama bunu anlamak benim için çok kolay (ve hatırlıyorum), buraya göndereceğimi düşündüm.


1

Örnek sadece satırları göster + yeni satırları veya boş satırları göstermiyor:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

VEYA

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
Kullanımı egrepuzun süre kullanımdan kaldırılmıştır. grep -EBurada aradığınız komut.
mikeserv 13.03.2014

0
egrep -v ^'(#|$)' file.txt

File.txt dosyasındaki tüm yorumları ve boş satırları soyun


2
Yanıtınızı, başlatılmamışlar için biraz daha fazla bilgi ile genişletmeyi düşünmelisiniz (örneğin, kullandığınız regex'in tam olarak ne yaptığını).
HalosGhost

egrepamortismana tabi tutulmuştur. Yerine grep -Evkullanın.
Yokai


0

Boş satırlar ve # ile başlayan satırlar hariç yeni bir dosyada satırları kaydetmek için aşağıdaki komutu kullanabilirsiniz.

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


İşe yaramaz bir catboru ve egrepamortismana tabi tutulur ve grep -Euzatılmış ifadeler ile değiştirilir veya sadece grep -v.
Yokai
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.