Удалить LF из последней строки в файле - PullRequest
1 голос
/ 15 марта 2012

Последняя строка моего файла не должна иметь LF в качестве последнего символа.

В VIM я могу сделать

:set noendofline binary
:wq

см. http://vim.wikia.com/wiki/File_format#Terminator_after_last_line

Как я могу сделать это с фильтром sed oneliner для более длинной трубы?

Любой другой инструмент (безголовый vim? Awk) мне подходит. нет perl pls.

Как насчет скалы или haskell!?

Ответы [ 6 ]

3 голосов
/ 15 марта 2012

Если вы хотите потерять все символы новой строки, работает следующее:

awk '{printf "%s", $0}'

Вы также можете использовать tr -d '\012' для удаления символов LF (NL);это, вероятно, быстрее, чем awk для задания.

С более сложным сценарием awk вы можете сохранить все переводы строки, кроме последнего, если вы хотите:(Вы не можете сделать с tr!) Оба этих сценария awk можно подключить к конвейеру.Я не знаю, будет ли awk обрабатывать огромные «однострочные» файлы, но, вероятно, с ними все будет в порядке.Помните, что многие инструменты Unix основаны на линиях - остерегайтесь слишком настойчивых усилий и тщательно проверяйте их перед вводом в эксплуатацию.

3 голосов
/ 15 марта 2012

Вы можете использовать head, чтобы получить все байты, кроме последнего:

head -c $(($(stat -c %s file.txt)-1)) file.txt

In python:

python -c 'import sys; sys.stdout.write(sys.stdin.read()[:-1])' <file.txt
1 голос
/ 15 марта 2012

Я думаю, что это поможет в Хаскеле:

import Data.List (intercalate)
main = interact (intercalate "\n" . lines)
1 голос
/ 15 марта 2012

Поскольку вы специально запрашиваете версию на Haskell, вот та, которая использует ByteString s, работая на stdin и stdout:

import Data.ByteString as B
import Data.ByteString.Internal (c2w)
import Data.Word

main :: IO ()
main = B.interact removeLastLF

lf :: Word8
lf = c2w '\n'

removeLastLF :: ByteString -> ByteString
removeLastLF xs | B.last xs == lf = B.init xs
                | otherwise       = xs
1 голос
/ 15 марта 2012

Это не так просто, как кажется. Вы можете использовать этот фильтр awk (1):

awk ' { if(l) { print line; } line=$0; l=1; } END { if(l) printf("%s", line); }'

В двух словах: он читает построчно. Если одна строка (= l true) уже прочитана, она печатает ее и запоминает следующую строку. В конце последняя строка печатается без перевода строки.

Вы могли бы добиться того же с помощью sed (1), если бы вы могли заставить его обрабатывать ввод как одну строку, но я не нашел возможности сделать это.

0 голосов
/ 21 сентября 2012

Вы можете просто перебрать через tr:

cat filename | tr -d "\n" > filename.nonl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...