Nie możesz Użyj ed lub GNU sed lub perl albo zrób to, co robią za kulisami, czyli utworzenie nowego pliku dla zawartości.
ed
, przenośny:
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF
GNU ANTYLOPA sed
:
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
Perl:
perl -i -l -F, -pae 'print @F[1,3]' foo
cut
, tworzenie nowego pliku (zalecane, ponieważ jeśli twój skrypt zostanie przerwany, możesz go ponownie uruchomić):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut
, zastępując plik na miejscu (zachowuje własność i uprawnienia foo
, ale potrzebuje ochrony przed przerwami):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
Polecam użycie jednej z cut
metod opartych na bazie . W ten sposób nie polegasz na żadnym niestandardowym narzędziu, możesz użyć najlepszego narzędzia do pracy i kontrolować zachowanie podczas przerwania.
.old
metoda wprowadzania zmian w miejscu,echo "$(cut -d , -f 1,3 <foo)" > foo
cut -d , -f 1,3 foo > foo.new
rm foo
mv foo.new foo
rm foo
. I nie powinieneś dzwonićrm foo
, ponieważmv foo.new foo
jest atomowy: usuwa starą wersję i jednocześnie umieszcza nową.Moreutils pakiet z Ubuntu (a także debian ) posiada program o nazwie
sponge
, która sort-of rozwiązuje również problem.Z gąbki męskiej:
Co pozwoli ci zrobić coś takiego:
źródło
Nie sądzę, że jest to możliwe przy użyciu
cut
samego. Nie mogłem tego znaleźć na stronie o człowieku lub stronie informacyjnej. Możesz zrobić coś takiego jakmktemp
tworzy względnie bezpieczny plik tymczasowy, do którego można potokować danecut
wyjściowe.źródło
Wypróbuj vim-way:
Spowoduje to edycję pliku w miejscu (najpierw wykonaj kopię zapasową).
Alternatywnie można zastosować
grep
,sed
lubgawk
.źródło
Możesz używać slurp z POSIX Awk:
Przykład
źródło
Cóż, ponieważ
cut
produkuje mniej danych wyjściowych niż czyta, możesz:Oznacza to, że stdin powinien być
file
otwarty w trybie tylko do odczytu, a stdoutfile
otwarty w trybie odczytu + zapisu bez obcinania (<>
).W ten sposób
cut
po prostu nadpisze plik na siebie. Pozostawia jednak pozostałą część pliku niezmienioną. Na przykład, jeślifile
zawiera:Dane wyjściowe staną się:
f\nb\n
Zastąpiłyfoo\n
, alebar
nadal istnieje. Po tym musisz przyciąć plikcut
skończyć zakończeniu.Za pomocą
ksh93
można to zrobić za pomocą<>;
operatora, który działa podobnie,<>
z tym wyjątkiem, że jeśli polecenie się powiedzie,ftruncate()
wywoływany jest w deskryptorze pliku. Więc:W przypadku innych powłok należy wykonać
ftruncate()
inne czynności, takie jak:chociaż wywoływanie
perl
tylko w tym celu jest nieco przesadne, szczególnie biorąc pod uwagę, żeperl
można z łatwością wykonać takącut
pracę, jak:Uważaj, że przy wszystkich metodach, które wymagają faktycznego przepisywania w miejscu, jeśli operacja zostanie przerwana w połowie, skończysz na uszkodzonym pliku. Użycie tymczasowego drugiego pliku pozwala uniknąć tego problemu.
źródło