Mam plik z komentarzami:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
Chcę tylko wydrukować cały niekomentowany kod:
foo
bar
stuff
morestuff
evenmorestuff
Możliwość usuwania komentarzy z pliku jest bardzo ważna ... Jak to zrobić?
shell-script
text-processing
awk
sed
grep
Znak zapytania
źródło
źródło
awk -F\# '$1!="" { print $1 ;} '
.echo '#' # output a #
obsłużyć linię ?Odpowiedzi:
Jednym ze sposobów, aby usunąć wszystkie komentarze jest skorzystanie
grep
z-o
opcji:gdzie
-o
: drukuje tylko dopasowaną część linii^
: początek linii[^#]*
: dowolny znak z wyjątkiem#
powtarzanego zera lub więcej razyZauważ, że puste linie również zostaną usunięte, ale pozostaną tylko linie ze spacjami.
źródło
grep -v '^#' file > newfilewithoutcomments
somvar='I am a long complicated string ## with special characters' # and I am a comment
nie będzie obsługiwana poprawnie.grep -o '^[^#].*' file
sed
rozwiązanie ma tylko jedną pustą linię, wydaje się solidnym argumentem, aby użyć innej odpowiedzi, chyba że czegoś brakuje?grep
? Spróbuj zmienićgrep
nacommand grep
, jeśli nadal widzisz spacje po przykładowym danych wejściowych.Wierzę, że
sed
można to zrobić znacznie lepiej niżgrep
. Coś takiego:Wyjaśnienie
sed
domyślnie spojrzy na plik linia po linii i wydrukuje każdą linię po ewentualnym zastosowaniu transformacji w cudzysłowie (sed '' your_file
po prostu wydrukuje wszystkie linie bez zmian).sed
dwa polecenia do wykonania w każdej linii (są one oddzielone średnikiem)./^[[:blank:]]*#/d
. W języku angielskim oznacza to, że jeśli wiersz pasuje do skrótu na początku (poprzedzony dowolną liczbą wiodących odstępów), usuń ten wiersz (nie zostanie wydrukowany).s/#.*//
. W języku angielskim, zamień znak krzyżyka, po którym następuje tyle rzeczy, ile możesz (to znaczy do końca linii) na nic (nic nie jest pustą przestrzenią między dwoma ostatnimi//
).źródło
mystring="Hello I am a #hash"
Stanie sięmystring="Hello I am a"
crontab
tylko dopuszcza komentarze pełnowymiarowe, z wiodącymi białymi znakami lub bez nich, ale nie zezwala na końcowe komentarze w linii. Logika jest DUŻO prostsza. Użyj tylko pierwszej z dwóch instrukcji Sed w tej odpowiedzi do ściągnięcia komentarza do pliku crontab.)#
(w kolumnie 1), jest jakaś korzyść dlased
przejęciagrep -v "^#"
?Wymaganą moc wyjściową można osiągnąć za pomocą polecenia sed. Poniższe polecenie załatwiło sprawę.
Gdzie
#.*$
- Regexp przefiltruje wszystkie ciągi, które zaczynają#
się od końca liniiTutaj musimy usunąć te wiersze, więc zastąpiliśmy pustą, więc pomijam część „zamienną”.
g
- wzmianka o powtarzanym wyszukiwaniu wzoru aż do osiągnięcia końca pliku.Ogólna składnia sed:
s/regexp/replacement/flags FileName
źródło
sed
polecenie ...print "#tag" # Print a hashtag.
Jak zauważyli inni, sed i inne narzędzia tekstowe nie będą działały dobrze, jeśli jakakolwiek część skryptu wygląda jak komentarz, ale tak naprawdę nie jest. Na przykład możesz znaleźć # w ciągu lub raczej wspólne
$#
i${#param}
.Napisałem program do formatowania powłok o nazwie shfmt , który ma funkcję zmniejszania kodu. Obejmuje to usuwanie komentarzy, między innymi:
Parser i drukarka są pakietami Go, więc jeśli potrzebujesz niestandardowego rozwiązania, napisanie 20-liniowego programu Go w celu usunięcia komentarzy w dokładnie taki sposób, jak chcesz, powinno być dość łatwe.
źródło
Możesz użyć dopasowania odwróconego w następujący sposób:
-v, --invert-match Odwraca sens dopasowania, aby wybrać niepasujące linie. (-v jest określone przez POSIX).
źródło
evenmorestuff
na przykładzie PO.grep -o '^[^#]*' file
byłoby najlepszym rozwiązaniem. tłumaczy to jimmij. dzięki za recenzjęprint "#tag" # Print a hashtag.
Podoba mi się odpowiedź Josepha, ale potrzebowałem jej również do usunięcia // komentarzy, więc nieco ją zmodyfikowałem i przetestowałem na redhat
Założę się, że jest lepszy sposób na usunięcie pustych linii niż używanie ciągów, ale to było szybkie i brudne rozwiązanie, którego użyłem.
-Twoje zdrowie
źródło
print "#tag" # Print a hashtag.
To zadziałało dla mnie
źródło
print "#tag" # Print a hashtag.
Służy
#
jako separator kolumn i zachowuje tylko pierwszą kolumnę (czyli wszystko wcześniej#
).źródło
YOUR_FILE
skrypt zawiera te polecenia, skrypt pozostawiłby sięcat YOUR_FILE | cut -'
w pliku w tym wierszu.Użyj wyrażenia jak
: -v: wykona odwrócenie dopasowania
: #: dopasuje wszystkie linie zaczynające się od #
: $ ^: dopasuje wszystkie puste linie
źródło
#
dopasuje się w dowolnym miejscu linii i usunie całą linię.Najlepszym rozwiązaniem byłoby użycie polecenia:
sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf
-I jest edycją lokalną, ale przedrostek bezpośrednio po nim mówi sedowi, aby utworzył kopię zapasową. W tym przypadku z rozszerzeniem daty (ntp.conf.date) Wykonujemy dwa polecenia, każde z przestrzenią adresową, pierwsze usuwa skomentowane linie, a drugie, oddzielone od pierwszego średnikiem, usuwa puste wiersze.
Znalazłem to rozwiązanie na: theurbanpenguin.com
źródło
Żadna z pozostałych odpowiedzi wydaje się nie oddawać tej sprawiedliwości, albo zostawiają w pustych liniach, albo w liniach, w których komentarz nie jest na pierwszym znaku. Skończyło się na tym:
Spowoduje to skonfigurowanie aliasu, abyś nie musiał go zapamiętywać (co jest niemożliwe na początku). Otwórz nową sesję, a będziesz mieć nowe
nocom
polecenie. Więc możesz po prostuTwoje zdrowie.
źródło
.*$
pierwszego wyrażenia regularnego nie ma większego sensu - kotwica nie jest przydatna i nie przechwytujesz dopasowanego tekstu do użycia w zamianie. użyj tylko^\s*
print "#tag" # Print a hashtag.
Po drugiej odpowiedzi Josepha R. dodaję,
/^$/d
aby usunąć pusty wiersz.źródło
Publikuję to, co działa dla mnie i wydaje się mieć sens, po przeczytaniu innych, z wyjaśnieniem. Kilka postów było blisko, ale nie mogłem jeszcze komentować (ponieważ jestem nowicjuszem):
-E
= interpretuj następujący wzorzec jako wyrażenie regularne, podobne do używania egrep-v
= wydrukuj odwrócenie wzoru (zostaną wydrukowane wiersze, które nie pasują do wyrażenia)"(^#.*|^$)"
= to ma potok oznaczający instrukcję OR. To wyrażenie mówi, aby wypisać dowolny wiersz rozpoczynający się od#
(i cokolwiek innego po nim) LUB dowolny wiersz z zerowymi znakami między początkiem i końcem wiersza.-v
Wypisze na ekranie odwrócenie tego, co będzie jakaś linia z postaciami, które nie rozpocznie się z#
.źródło
print "#tag" # Print a hashtag.