LINUX.ORG.RU

sed: удалить последний перенос в файле

 ,


0

2

Добрый день, уважаемые участники форума! Хотел спросить, как с помощью sed сделать сабж. Мне нужно удалить перенос на последнюю строку, если она пустая, то есть по условию. Или по-другому удалить последний символ в файле, если он является символом переноса (\x0A). Пока не могу разобраться, как это сделать. Есть конструкции, которая делает что-то подобное, например

sed ':a; /$/N; s/\n//; ta'
но она удаляет все переносы, а мне необходимо удаление только последнего.


но она удаляет все переносы

Последний перенос эта конструкция, вроде как не удаляет. На awk можно так:

awk 'NR>1{printf "\n"} {printf $0}' test3.txt

mky ★★★★★
()
Ответ на: комментарий от mky

Да, вы правы, не удаляет, удаляет только до последнего переноса. PS: А на sed можно как-то это замутить? Просто использую в основном именно его.

xseed
() автор топика
Ответ на: комментарий от anonymous

Что-то не сработало:

C:\nncron>sed --version
[bash]GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

Главное, что ошибок никаких не выдает, а перенос остается, не удаляется:

C:\nncron>getclip | sed -e "${s/^$//;T;d;}"
Заменить
Удалить

C:\nncron>

xseed
() автор топика
Ответ на: комментарий от xseed
C:\nncron>getclip
Заменить
очистить/удалить

C:\nncron>getclip | gawk.exe "NR>1{printf \"\n\"} {printf $0}"
Заменить
очистить/удалить
C:\nncron>
xseed
() автор топика
Ответ на: комментарий от anonymous

Походу он gsed вообще не соображает, есть ли перевод строки в конце файла или нет, так как одно и тоже регулярное выражение, выполняющее замену в последней строке, действует только на ту строку, в которой содержится текст, то есть не действует на пустую строку:

C:\nncron>getclip | sed -e "$s/о/s/"
Заменить
sчистить/удалить
C:\nncron>getclip | sed -e "$s/о/s/"
Заменить
sчистить/удалить

C:\nncron>

sed решает, что вторая строка является последней строкой в обоих случаях, даже если их три.

xseed
() автор топика

с чего ты взял что это подходящий инструмент, стандарт говорит:

Whenever the pattern space is written to standard output or a named file, sed shall immediately follow it with a <newline>.

perl -pe '$_.chop if eof' или лучше ruby -pe '$_.chop! if $<.eof'

anonymous
()
Ответ на: комментарий от xseed

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

sed -e "$s/.$//"
Есть выражение, вставляющее перевод строки в конце последней строки:
sed -e "$s/$/\x0A/"
Но нет выражения, удаляющее перевод предпоследней строки на новую строку:
sed -e "$s/\x0A//"
- не работает. Так все таки можно или нет удалить с помощью sed символ перевода строки \x0A в конце файла?

xseed
() автор топика
Ответ на: комментарий от anonymous

Да так, ради спортивного интереса) Я считаю, вы правы. PS: А drBatty есть на форуме? Может он скажет еще веское слово?

xseed
() автор топика
Ответ на: комментарий от xseed

cmd.exe не понимает: sed.exe не понимает.

xseed
() автор топика
Ответ на: комментарий от anonymous
sed '${s/^$//;T;d;}'

А что означает команда T в этой фразе?

xseed
() автор топика
Ответ на: комментарий от ArcFi

Значит, нельзя.

sed ":a;N;$!ba;s/\n//g"
sed ":a;/$/N;s/\n//;ta"
Эти фразы также удаляют все переносы, кроме последнего.

xseed
() автор топика
Ответ на: комментарий от ArcFi

Оказывается у меня была версия 4.0.7!

c:\nncron>sed.exe --version
GNU sed version 4.0.7
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

Здесь _ttp://www.cyberforum.ru/cmd-bat/thread1838929.html, посоветовали версию sed 4.2.1 Оказывается в ней появился секретный ключ -z, который и позволяет это сделать! Я, деревня, даже и не знал об этом) Вот regexp:

getclip | sed.exe -z "$s/\n$//" > out.txt
Просто я использовал утилиту paste.exe с c3scripts.com, который, в отличие от getclip, выводит текст на консоль в кодировке UTF-8, а не в стандартной windows-1251 и команда:
paste.exe | sed.exe -z "$s/\n$//" > out.txt
не смогла обработать перевод строки в тексте UNICODE.

xseed
() автор топика
Ответ на: комментарий от anonymous

Походу подходящий), только если текст не юникодовый...

xseed
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.