2009-10-20 8 views
8

plik1:Zastosowanie sed, aby usunąć wszystkie wiodące/następujące spacje w pliku tekstowym

hello 
    world 

Jak należałoby usunąć prowadząc/końcowe spacje w tym pliku za pomocą LEP - przy użyciu jednego polecenia (bez plików pośrednich)?

Ja obecnie mam:

sed -e 's/^[ \t]*//' a > b 

Na czołowych miejscach.

sed 's/ *$//' b > c 

I to w przypadku spacji końcowych.

+0

Podczas gdy odpowiedź @ ghostdog74 jest dobra, odpowiedź @ mouviciel jest poprawna * zgodnie z twoim pytaniem. Przegłosowałem oba, ale uważam, że @mouviciel zasługuje na akceptację jako poprawną odpowiedź. –

+0

Masz rację - mouviciel jest teraz akceptowany. Dzięki zarówno mouviciel (poprawna odpowiedź), jak i ghostdog74 (wskazówki do awk) na czas! – user191960

Odpowiedz

10

Prawie got it:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c 

Ponadto w niektórych smakach sed, istnieje również możliwość edycji inline:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a 
+3

Chciałbym również rozważyć dopasowanie '\ s', który jest ogólny" wszystkie znaki białych znaków ". –

+0

Nie powinno to być "sed -e" s/^ [\ t] * //; s/[\ t] * $ // 'a> c'? –

+0

Nadal widzę 'sed -e 's/^ [\ t] * //; s/[\ t] * $ /' a> c' który nie działa dla mnie (wersja bash 4.3.30, Funtoo-Linux). –

7

łatwiejszy sposób, za pomocą awk

awk '{$1=$1}1' file 

lub

awk '{gsub(/^ +| +$/,"")}1' file 
+0

Pierwszy z nich działał idealnie i jest najbardziej uproszczony - wiem, że nie jest to, o co prosiłem (tj. Sed) - ale jest tak elegancki :). Zajrzę teraz do awk. – user191960

+0

Pierwsza usuwa wszystkie pozorne spacje, nie tylko prowadzące i kończące.Drugi działa najlepiej. 'awk' to świetne narzędzie. – mouviciel

+0

Ah, widzę pozostałe przestrzenie usunięte z pierwszym teraz - drugi działa bez dodatkowych usunięć. – user191960

3
perl -lape 's/^\s+|\s+$//g' 

Szczerze mówiąc, wiem, Perl wyrażeń regularnych najlepszy, więc znajdę perl -lape znacznie łatwiejszy w użyciu niż sed -e.

Ponadto, aby odpowiedzieć na oryginalne pytanie, można się sed wykonać wiele operacji takich jak to:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/' 

Podobno można również umieścić dwie zmiany w jeden ciąg, oddzielając je średnikiem, jak wskazano w kolejna odpowiedź.

0

Należy zauważyć, że w bardziej ogólnym przypadku stosowania kilku filtrów w rzędzie do pliku wejściowego bez korzystania z plików pośrednich, rozwiązaniem jest użycie rur:

sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c 

Oczywiście nie są one wymagane tutaj, ponieważ jednym wywołaniu sed jest wystarczające, ale jeśli drugie polecenie sed było czymś innym, jak uniq lub sort, to ten wzór jest właściwy.

Powiązane problemy