Chciałbym wiedzieć, czy istnieje sposób, w jaki mógłbym cat
zapisać php.ini
i usunąć wszystkie wiersze zaczynające się od;
Na przykład, jeśli plik zawierał to:
; - 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
i uruchomiłem prawidłowe polecenie cat | {remove comments command}
, a następnie skończyłem na:
error_reporting = E_ALL & ~E_NOTICE
Uwaga - Sądziłem, że cat
będzie najlepszym sposobem, aby to zrobić, ale jestem naprawdę w porządku z odpowiedzią przy użyciu innego narzędzia jak awk
, sed
, egrep
, itd.
error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices
? Czy komentarz również powinien zostać usunięty?cat
to narzędzie do łączenia plików.grep
to narzędzie do filtrowania linii na podstawie wzorów.sed
iawk
może również modyfikować te linie.Odpowiedzi:
Możesz użyć:
źródło
Nie musisz przesyłać pliku przez grep, grep przyjmuje nazwy plików jako argumenty linii poleceń.
wypisze wszystkie linie Z WYJĄTKIEM tych, które zaczynają się od # char. możesz zmienić znak komentarza na cokolwiek chcesz.
Jeśli masz więcej niż jeden znak komentarza (zakładając, że jest on na początku wiersza)
źródło
grep '^[^;]' filename
. Nie mogę jednak mówić o jego przenośności!egrep
togrep -E
. Można również użyćgrep -ve '^[;#]' -e '^//'
egrep
może zaoszczędzić ci korzystania zcat
. Innymi słowy, stwórz mniej procesów (egrep
vscat
+egrep
) i używaj mniej buforów (potok odcat
doegrep
potok bez).Zasadniczo dobrym pomysłem jest ograniczenie użycia,
cat
jeśli po prostu chcesz przekazać plik komendzie, która może go odczytać samodzielnie.Powiedziawszy to, następujące polecenie usunie komentarze, nawet jeśli są wcięte spacjami lub tabulatorami:
źródło
[[
klasy znaków]]
z użyciemegrep
polecenia przestarzałego przez co najmniej dekadę.wyklucza to linie rozpoczynające się od „;” i puste linie.
w wyrażeniu regularnym
^
wskazuje początek linii i$
koniec linii, więc^$
określa linie, w których znak początku linii i znak końca linii znajdują się obok siebie.źródło
egrep -v '^;'
egrep -v '^[[:blank:]]*;' file.ini
Prosty
awk
jednowarstwowyawk '/^;/{next}1' input_file
powinien załatwić sprawę.źródło
awk '!/^;/' input_file
.Podobnie jak Jaypal, najprawdopodobniej również użyłbym
awk
do tych celów. Gorzej jest wspomnieć, że Perl jest czasem bardzo przydatny do takich celów:Wyrażenia regularne Perla mają większą moc niż w awk i czasami możesz ich potrzebować.
źródło
perl -ne 'print unless /^;/' data.txt
cat
działa dobrze w tych przykładach, jeśli weźmiesz to pod uwagę jako bardziej ogólne określenie „cokolwiek generującego tekst na STDOUT”. Rury uniksowe są najlepsze od krojonego chleba, imho. :)Opracowanie odpowiedzi @ shabunc, używa Perla do usuwania komentarzy (w tym komentarzy śródliniowych), a następnie drukowania dowolnych linii zawierających cokolwiek innego niż białe znaki.
Wyjaśnienie:
s/;.*//
używa operatora podstawienia (s/<regex>/<replacement>/
) w celu zastąpienia wystąpień średnika i wszystkiego po nim w wierszu z pustym łańcuchem.print if /\S/
wypisuje linię, jeśli pasuje do wyrażenia regularnego\S
, który jest klasą znaków pasującą do wszystkich znaków niebiałych spacji.źródło
Oto jeden, którego używam, wystarczy zastąpić ';' ze znakiem komentarza (np. „#” dla wielu plików konfiguracyjnych usługi UNIX):
Pozbywa się to wszystkich komentarzy obejmujących całą linię (nawet jeśli mają wiodące białe znaki) oraz wszelkich komentarzy, które kończą wiersze bez komentarzy, i zwięźle usuwa również puste linie z danych wyjściowych. Może to być możliwe bez rurociągu (mój sed- lub awk-fu nie jest wprawdzie świetny), ale tak łatwo mi to zrozumieć (i pamiętać), pomyślałem, że opublikuję to tutaj.
źródło
Przykład pokazuje tylko linie + nie pokazuje nowych linii ani pustych linii:
LUB
źródło
egrep
jest od dawna przestarzałe.grep -E
to polecenie, którego tu szukasz.Usuwa wszystkie komentarze i puste wiersze z pliku.txt
źródło
egrep
jest amortyzowane. Użyjgrep -Ev
zamiast tego.Usunie również puste linie
źródło
możesz użyć następującego polecenia, aby zapisać linie, z wyjątkiem pustych linii i linii zaczynających się od # w nowym pliku
cat <file to be read> | egrep -v '^#|^$' > <file to be written at>
źródło
cat
Rura bezużyteczna iegrep
jest amortyzowana i należy ją zastąpićgrep -E
rozszerzonymi wyrażeniami lub po prostugrep -v
.