Предположим следующую команду,sed: Почему команда q добавляет новую строку?
echo -en "abc1\ndef2\nghi1" | sed -n 'p; d;'
В этом случае на выходе будет так же, как было бы без СЕПГ вообще. Таким образом, в последней строке нет нового символа линии. Следующая команда
echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; d;}'
sed принты все кроме последней строки без изменений. Последняя строка сокращается на один символ. Тем не менее на последней строке нет нового символа линии. Следующая команда
echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; q1;}'
(«d» заменить словами «q1» в командном блоке последнего. То же выход, как и раньше, но на этот раз есть дополнительный символ новой строки в последней строке.
- Почему?
- Как исправить
(для тех, кто заинтересован в намерении этой команды: Учитывая определенный STDIN, я хочу, чтобы сканировать для последнего символа, передать STDIN в STDOUT без этого лаз t и установить код выхода на основе этого символа. Никакой другой модификации не должно быть. СЕПГ, кажется, идеально, если бы не эта проблема новой строки
sed -n '
$! {p; d;}; #print any non last line, do next cycle
/0$/ {s/0$//; p; d}; #last line ending with 0? Remove 0, print, next cycle
/1$/ {s/1$//; p; d}; #last line ending with 1? Remove 1, print, next cycle
{p} #fall back, print last line
'
До сих пор этот скрипт отлично работает в отношении к проблеме перевода строки. Новая строка не добавляется. Теперь, если я заменить команду «D» с «д»
sed -n '
$! {p; d;}; #print any non last line, do next cycle
/0$/ {s/0$//; p; q0}; #last line ending with 0? Remove 0, print, exit 0
/1$/ {s/1$//; p; q1}; #last line ending with 1? Remove 1, print, exit 1
{p} #fall back, print last line
'
проблема новой строки вдруг возникают ...
Другие решения приветствуются, они должны быть как можно быстрее.
действительно ли 'q' cmd принимает необязательный целочисленный аргумент или он просто игнорирует его? Что произойдет, если вы измените 'q1' на просто' q'? Хорошо иллюстрированная проблема, удачи, получив ответ! – shellter
Да, он принимает необязательное целое число. Целое число используется как код выхода. Но некоторые manpages не указывают это. «q» - это всего лишь сокращение для «q0». – Henning