GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu smazat nový řádek, pokud je to poslední znak v souboru?

perl -pe 'chomp if eof' filename >filename2

nebo pro úpravu souboru na místě:

perl -pi -e 'chomp if eof' filename

Na webu awk, který jsem viděl, to bylo popsáno jako 'perlské rouhání'.

Ale v testu to fungovalo.


Můžete využít toho, že náhrady příkazů shellu odstraňují znaky na konci nového řádku :

Jednoduchý formulář, který funguje v bash, ksh, zsh:

printf %s "$(< in.txt)" > out.txt

Přenosná alternativa (v souladu s POSIX) (o něco méně efektivní):

printf %s "$(cat in.txt)" > out.txt

Poznámka:

  • Pokud in.txt končí na více znaky nového řádku, substituce příkazu odstraní vše z nicha . (Neodstraňuje mezery jiné než koncové nové řádky.)
  • Protože tento přístup přečte celý vstupní soubor do paměti , je vhodné pouze pro menší soubory.
  • printf %s zajišťuje, že k výstupu není připojen žádný nový řádek (je to alternativa kompatibilní s POSIX k nestandardnímu echo -n; viz http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html a https://unix.stackexchange.com/a/65819)

Průvodce dalšími odpověďmi :

  • Pokud Perl je k dispozici, přejděte na přijatou odpověď – je jednoduchá a nenáročná na paměť (nečte celý vstupní soubor najednou).

  • V opačném případě zvažte Awk od ghostdog74 odpověď – je to obskurní, ale také paměťově efektivní; čitelnější ekvivalent (vyhovující POSIX) je:

  • awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt

  • Tisk je zpožděn o jeden řádek, takže poslední řádek lze zpracovat v END bloku, kde se vytiskne bez koncového \n kvůli nastavení oddělovače výstupního záznamu (OFS ) na prázdný řetězec.

  • Pokud chcete podrobné, ale rychlé a robustní řešení, které skutečně upraví na místě (na rozdíl od vytvoření dočasného souboru, který pak nahradí původní), zvažte skript Perl jrockway .


Linux
  1. Jak mohu symbolicky propojit soubor v Linuxu?

  2. pomocí linuxu, jak mohu předat obsah souboru jako parametr spustitelnému souboru?

  3. Jak uložit výstup tohoto příkazu awk do souboru?

  1. Jak mohu uvést (ls) posledních 5 upravených souborů v adresáři?

  2. Jak mohu přidat běžného uživatele do souboru sudoers?

  3. Jak zazipujete soubor a uchováte soubor .gz?

  1. Jak přidat nový řádek na konec souboru?

  2. Jak se mohu ujistit, že můj systém používá soubor ~/.screenrc?

  3. Jak vytisknout poslední řádek komprimovaného souboru gz na příkazovém řádku?