Wszystkie wiersze z komentarzami w pliku zaczynają się od #. Jak mogę usunąć wszystkie linie (i tylko te linie), które zaczynają się od #? Inne wiersze zawierające #, ale nie na początku wiersza, należy zignorować.
Czy musi współpracować ze wspólną konwencją, która #blah \<nl>blahliczy się jako pojedyncza „linia logiczna”, ponieważ odwrotny ukośnik ucieka przed nową linią?
sarnold 21.11.11
@sarnold: oprócz tego make, które narzędzia używają „linii odwrotnego ukośnika przed zakończeniem komentarza”? Powłoki (testowane na bash i ksh) nie. C i C ++ obsługują splicing nowego wiersza przed innym przetwarzaniem dyrektyw preprocesora, ale są to dyrektywy, a nie komentarze.
Jonathan Leffler
@Jathanathan: Awesome. Założyłem, że wspólne \<nl>ucieczkowanie zadziała również na komentarze. Ale łał, myliłem się. Nie znalazłem jeszcze innego przykładu ... :) Dzięki!
Jestem trochę zaskoczony, że nikt nie zaproponował najbardziej oczywistego rozwiązania:
grep -v '^#' filename
To rozwiązuje problem, jak stwierdzono.
Zauważ jednak, że wspólna konwencja #traktuje wszystko od końca do końca linii jako komentarz:
sed 's/#.*$//' filename
chociaż traktuje to na przykład #znak w dosłownym ciągu jako początek komentarza (który może, ale nie musi mieć znaczenia w twoim przypadku) (i pozostawia puste wiersze).
Linia zaczynająca się od dowolnej spacji, po której następuje, #może być również traktowana jako komentarz:
grep -v '^ *#' filename
jeśli białe znaki to tylko spacje, lub
grep -v '^[ ]#' filename
gdzie te dwie spacje są w rzeczywistości spacją, po której następuje dosłowny znak tabulacji (wpisz „control-v tab”).
W przypadku wszystkich tych poleceń pomiń filenameargument do odczytu ze standardowego wejścia (np. Jako część potoku).
Jeśli chcesz również usunąć wiersze komentarza, które zaczynają się od pewnego spacji, użyj
sed -i '/^\s*#/ d'
Zwykle chcesz zachować pierwszą linię skryptu, jeśli jest to sha-bang, więc sednie należy usuwać linii zaczynających się od #!. powinien także usuwać wiersze, które zawierają tylko skrót, ale nie zawierają tekstu. poskładać wszystko do kupy:
sed -i '/^\s*\(#[^!].*\|#$\)/d'
Aby zachować zgodność ze wszystkimi wariantami sed, musisz dodać kopię zapasową rozszerzenia do -iopcji:
Zakładając, że egrepobsługuje tę składnię; starsze wersje mogą nie.
Keith Thompson
-3
Oto pętla dla wszystkich plików z pewnym rozszerzeniem:
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
#blah \<nl>blah
liczy się jako pojedyncza „linia logiczna”, ponieważ odwrotny ukośnik ucieka przed nową linią?make
, które narzędzia używają „linii odwrotnego ukośnika przed zakończeniem komentarza”? Powłoki (testowane na bash i ksh) nie. C i C ++ obsługują splicing nowego wiersza przed innym przetwarzaniem dyrektyw preprocesora, ale są to dyrektywy, a nie komentarze.\<nl>
ucieczkowanie zadziała również na komentarze. Ale łał, myliłem się. Nie znalazłem jeszcze innego przykładu ... :) Dzięki!Odpowiedzi:
Można to zrobić za pomocą sed-one-liner :
To mówi: „znajdź wszystkie wiersze zaczynające się od # i usuń je, pozostawiając wszystko inne”.
źródło
sed /^#/d
sed '/^#/ d' < inputFile.txt > outputFile.txt
sed -i '/^#/d' filepath
.sed -i '' '/^#/d' filepath
na Macu ( ponieważ sufiks -i jest obowiązkowy )awk '/^#/ && !first { first=1 ; next } { print $0}'
Jestem trochę zaskoczony, że nikt nie zaproponował najbardziej oczywistego rozwiązania:
To rozwiązuje problem, jak stwierdzono.
Zauważ jednak, że wspólna konwencja
#
traktuje wszystko od końca do końca linii jako komentarz:chociaż traktuje to na przykład
#
znak w dosłownym ciągu jako początek komentarza (który może, ale nie musi mieć znaczenia w twoim przypadku) (i pozostawia puste wiersze).Linia zaczynająca się od dowolnej spacji, po której następuje,
#
może być również traktowana jako komentarz:jeśli białe znaki to tylko spacje, lub
gdzie te dwie spacje są w rzeczywistości spacją, po której następuje dosłowny znak tabulacji (wpisz „control-v tab”).
W przypadku wszystkich tych poleceń pomiń
filename
argument do odczytu ze standardowego wejścia (np. Jako część potoku).źródło
grep -v "^#" filename
Przeciwieństwo rozwiązania Raymonda:
„nie drukuj niczego, z wyjątkiem linii, które NIE zaczynają się od #”
źródło
możesz bezpośrednio edytować swój plik za pomocą
Jeśli chcesz również usunąć wiersze komentarza, które zaczynają się od pewnego spacji, użyj
Zwykle chcesz zachować pierwszą linię skryptu, jeśli jest to sha-bang, więc
sed
nie należy usuwać linii zaczynających się od#!
. powinien także usuwać wiersze, które zawierają tylko skrót, ale nie zawierają tekstu. poskładać wszystko do kupy:Aby zachować zgodność ze wszystkimi wariantami sed, musisz dodać kopię zapasową rozszerzenia do
-i
opcji:źródło
Możesz użyć następujących rozwiązań dla rozwiązania awk -
źródło
Ta odpowiedź opiera się na wcześniejszej odpowiedzi Keitha .
egrep -v "^[[:blank:]]*#"
powinien odfiltrować wiersze komentarza.egrep -v "^[[:blank:]]*(#|$)"
powinien odfiltrować zarówno komentarze, jak i puste wiersze, co jest często przydatne.Informacje o
[:blank:]
klasach znaków i innych klasach można znaleźć na stronie https://en.wikipedia.org/wiki/Regular_expression#Character_classes .źródło
egrep
obsługuje tę składnię; starsze wersje mogą nie.Oto pętla dla wszystkich plików z pewnym rozszerzeniem:
źródło