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ímuecho -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 .