it-swarm-eu.dev

Podporuje třídění třídění souborů na místě, například „sed - in-place“?

Jsem slepý nebo neexistuje možnost jako --in-place pro sort?

Za účelem uložení výsledků do vstupního souboru používá sed _ -i (--in-place).

Přesměrování výstupu sort na vstupní soubor

sort < f > f

má za následek, že je prázdný. Pokud neexistuje možnost --in-place - možná existuje nějaký trik, jak to provést šikovně způsobem?

(Jediná věc, která mě napadá:

sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$

Přesun není správná volba, protože může dojít ke změně oprávnění soubor. Proto přepisuji obsah dočasného souboru, který poté odstraním.)

89

sort-o, --output volba, která vezme název souboru jako argument. Pokud je stejný jako vstupní soubor, zapíše výsledek do dočasného souboru a přepíše původní vstupní soubor (přesně to samé jako co sed -i ano).

Z GNU sort informační stránka:

`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
      Write output to OUTPUT-FILE instead of standard output.  Normally,
      `sort' reads all input before opening OUTPUT-FILE, so you can
      safely sort a file in place by using commands like `sort -o F F'
      and `cat F | sort -o F'.  However, `sort' with `--merge' (`-m')
      can open the output file before reading all input, so a command
      like `cat F | sort -m -o F - G' is not safe as `sort' might start
      writing `F' before `cat' is done reading it.

      On newer systems, `-o' cannot appear after an input file if
      `POSIXLY_CORRECT' is set, e.g., `sort F -o F'.  Portable scripts
      should specify `-o OUTPUT-FILE' before any input files.

az The Open Group Base Specifications Issue 7 :

-o  output
    Specify the name of an output file to be used instead of the standard 
    output. This file can be the same as one of the input files.
123
enzotib

Můžete použít funkci sponge , která nejprve namočí stdin a poté ji zapíše do souboru, například:

sort < f | sponge f

Nevýhodou sponge je, že uloží dočasný výstup do paměti, což může být problematické pro velké soubory. V opačném případě jej musíte nejprve zapsat do souboru a poté přepsat původní soubor.

Jak však upozorňují jiné odpovědi, na místě nejsou úpravy obecně dobrý nápad, protože uprostřed procesu (například sponge one) se stroj může zhroutit a pak můžete oba ztratit původní a nový soubor. Nejdříve byste ho měli zapsat do jiného souboru a poté použít atomovou instrukci mv (přesunout).

11
Willem Van Onsem

Je nebezpečné přepsat vstupní soubor výstupním souborem, protože pokud během zápisu souboru dojde ke zhroucení programu nebo systému, ztratili jste oba.

Několik programů (většinou GNU verze) má možnost na místě (např. -i na Perlu a GNU sed; -o on GNU sort). Pracují tak, že ukládají data do dočasného souboru a poté je přesouvají na místo. U programů, které takovou možnost nemají, tilita sponge od Colina Watsona (zahrnuta v Jout Hess's moreutils ) provede práci bezpečně pro jakýkoli program (příklady: - Mohu provést cut změnit soubor na místě? ; Jak mohu přimět iconv, aby nahradil vstupní soubor konvertovaným výstupem? ).

Doporučuji přepsat soubor na místě pouze ve výjimečných případech, kdy nemůžete znovu vytvořit původní soubor se stejnými oprávněními. V takovém případě byste měli původní vstup někde uložit. A pak můžete jednoduše zpracovat kopii vstupu a odeslat ji do původního souboru.

cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional

Použijte -o nebo zkuste cestu vim:

$ ex -s +'%!sort' -cxa file.txt
4
kenorb