grep - usuwanie tekstu po tokenie separatora


12

Mam plik, w którym muszę usunąć wszystko po pierwszym ;w każdej linii.

Plik taki jak ten:

sdfsdsdf;
fsdfsddf;sdfsd;

Spowoduje to:

sdfsdsdf
fsdfsddf

Zajrzałem do grepi sed. Byłbym wdzięczny za odpowiedź zawierającą jedno z tych poleceń.

Odpowiedzi:


5

sed jest prawdopodobnie najłatwiejszy i szybszy niż awk lub perl w takich okolicznościach:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name

6
To jest bardziej skomplikowane niż powinno być! sed 's/;.*//'
Gilles „SO- przestań być zły”

Pozwolę sobie być innego zdania. perl -pe 's /;.*//' some_file_name jest tak samo łatwe i prawdopodobnie do 1500% szybsze podczas pracy w dużych plikach.
kodhead

Mam kilka systemów, w których sed jest dostępny, ale Perl nie, więc zachęcam do stosowania lżejszych rozwiązań tam, gdzie są wystarczające.
dubiousjim

7

inną opcją jest użycie cutpolecenia

cat a.file | cut -d';' -f1

9
bezużyteczne nas kota

3

Zwykle używam awkdo takich rzeczy:

cat a.file | awk -F=";" '{ print $1 }'

To zajmie każdą linię pliku i wydrukuje pierwszą grupę przed ogranicznikiem -F


7
bezużyteczne użycie cat.
Wstrzymano do odwołania.

1
Drugi Dennis tam. A pod Linuksem i BSD -F = ";" nie działa zgodnie z przeznaczeniem. Możesz też zacytować 1 $: awk -F ";" '{print $ 1}' a.file
codehead

2

Oto sposób na zrobienie tego za pomocą GNU grep:

grep -Po "^[^;]+(?=;?)" filename

Bez Gnu grep: grep -Eo '^[^;]+;' filenameprawie go dostaje, drukuje tylko jedną postać za dużo. grep -Eo '^[^;]+' filenameprawie go też dostaje, ale wypisze również pełne (niepuste) linie, które nie mają żadnych ;.
dubiousjim
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.