2013-04-24 12 views
9

Mam polecenie sed do usuwania spacji po przecinkach.Używanie sed między określonymi liniami Tylko

sed -e 's/,\s\+/,/g' example.txt 

Jak mogę to zmienić, spowoduje to zmianę pomiędzy tylko określonymi numerami linii.

(np. Między drugą a trzecią linią).

+1

Linia 2.5 ......? –

+0

Czy te konkretne numery linii są znane w momencie, kiedy wywołujesz sed, lub czy w pliku znajdują się regiony, które zależą od samych danych? Podobnie jak sed powinien być aktywny tylko pomiędzy niektórymi znacznikami początku i końca? W takim przypadku użyłbym 'awk', ponieważ możesz zachować zmienne stanu między liniami. –

Odpowiedz

17

Zastosowanie:

sed '2,3s/,\s\+/,/g' example.txt 
1
sed -e '2,3!b;s/,\s\+/,/g' example.txt 

Wersja ta może być przydatna, jeśli chcesz później dodać kolejne polecenia przetwarzać żądane linie.

+2

Podejrzewam, że tutaj są dobre informacje. Ale muszę przyznać, że nie śledzę tego, co się dzieje. Nie jest dla mnie oczywiste, dlaczego '! B' i'; 'są obecne i jak są przydatne później. Być może trochę wyjaśnisz. – jww

3

Od OSX (BSD sed) ma pewne różnice składniowe Linux (GNU) sed pomyślałem, że należy dodać następujące z niektórych trudem nutami kopalni:

OS X (BSD) LEP znaleźć/wymienić wewnątrz (adresów) bloku (początek i wzory końcowego (/../) lub #s linia) w tym samym pliku (via & via & via & sekcja 4,20 here)

Składnia

$ sed '/start_pattern/,/end_pattern/ [operations]' [target filename] 

standard znaleźć/wymienić przykłady:

$ sed -i '' '2,3 s/,\s\+/,/g' example.txt 
$ sed -i '' '/DOCTYPE/,/body/ s/,\s\+/,/g' example.txt 

Znajdź/wymienić przykład ze złożonych operatora i grupy (nie może pracować bez grupowania składnię z powodu strumienia wykorzystanie standardowego wejścia). Wszystkie dane przedstawione w grupy muszą być na oddzielnych liniach, albo rozdzielone w/średnikami:

Complex Operator Przykład (usunie cały wiersz zawierający mecz):

$ sed -i '' '2,3 {/pattern/d;}' example.txt 

Wielu plik odnaleźć + sed:

$ find ./ -type f -name '*.html' | xargs sed -i '' '/<head>/,/<\/head>/ {/pattern/d; /pattern2/d;}' 

Mam nadzieję, że to komuś pomaga!

Powiązane problemy