2016-07-04 3 views
2

Предположим следующую команду,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 
' 

проблема новой строки вдруг возникают ...

Другие решения приветствуются, они должны быть как можно быстрее.

+0

действительно ли 'q' cmd принимает необязательный целочисленный аргумент или он просто игнорирует его? Что произойдет, если вы измените 'q1' на просто' q'? Хорошо иллюстрированная проблема, удачи, получив ответ! – shellter

+0

Да, он принимает необязательное целое число. Целое число используется как код выхода. Но некоторые manpages не указывают это. «q» - это всего лишь сокращение для «q0». – Henning

ответ

2

Я думаю, что это ошибка. Согласно руководству, q не должен печатать пространство шаблонов, если автоматическая печать отключена. Таким образом, он ничего не должен печатать. Поскольку вы уже используете GNU sed, вы можете избежать этой проблемы, используя Q вместо q. По крайней мере, это работает для меня (версия 4.2.2).

+0

Да, использование «Q» вместо «q» решило проблему для меня тоже. Большое спасибо! – Henning

Смежные вопросы