Chcę usunąć 5. słowo każdego wiersza w pliku.
Obecna zawartość pliku:
File is not updated or and will be removed
System will shut down f within 10 seconds
Please save your work 55 or copy to other location
Kindly cooperate with us D
Oczekiwany wynik:
File is not updated and will be removed
System will shut down within 10 seconds
Please save your work or copy to other location
Kindly cooperate with us
text-processing
sed
awk
pmaipmui
źródło
źródło
-f
nie jest obsługiwane w moimcut
(GNU) przynajmniej ..--complement
flagę uproszczenia rzeczy:cut --complement -d ' ' -f5
. Pamiętaj, aby przekierować wyjście do nowego pliku, a następniemv
na oryginał.awk: usuwa 5. pole
Jeśli chcesz zapisać plik w miejscu: /programming//q/16529716/7552
Możesz po prostu usunąć zawartość 5. pola, ale pozostawia to dwa kolejne separatory pól wyjściowych:
źródło
Z POSIX sed:
źródło
_
a nie niczego innego wtedy:blank:
lub:space:
?\(
służy grupa przechwytywania\)
?glenn zaproponował rozwiązanie równoważne
Jak zauważył on i inni
Hack, aby rozwiązać trzeci problem, to
To pozostawi jedno lub więcej dodanych spacji na końcu każdego wiersza, w którym było pięć lub mniej słów. Jeśli potrafisz zidentyfikować słowo, które nigdy nie pojawi się na wejściu,
poradzi sobie nawet z tym (ale nadal pozostawia problemy 1 i 2).
źródło
Bardziej wytrzymały (sed bierze najdłuższy możliwy wzorzec i wzorzec z
*
może pomijać separację lub słowo w pierwszej wersji), ale nieco dłuższą wersjęźródło
sed 's/[^[:blank:]]*//5'
sed 's/[[:blank:]*[^[:blank:]]*//5'
jest lepiej. Bardzo dobra uwaga. Podejrzewałem, że sed bierze każdy pojedynczy znak jako byt, ale ma największy niezakłócony wzór jako bytsed 's/[[:blank:]][^[:blank:]]*//4'
całkowicie usunie 5. pole.sed 's/[[:blank:]][^[:blank:]][^[:blank:]]*//4'
, albo w / GNU / BSD / toyboxsed
s:sed -E 's/[[:blank:]][^[:blank:]]+//4'
.Perl
źródło
Inna możliwość, przy założeniu cięcia GNU:
źródło
Używając Perla> 5.10 (i z powodzeniem wypisując wszystkie linie: 0)): -
źródło