Почему непоследовательность с использованием cat и echo для этой команды sed?

Вдохновленный этим вопросом : команда sed: N не читает одну строку. Я хотел понять, почему, по-видимому, существует несогласованность между двумя следующими командами:

# 1. эхо

Эта команда не производит вывод

$ echo -en 'abc\n' | sed -n 'N;p' $ 

Хэш-дамп выхода из echo :

od – восьмеричная свалка

 $ echo -en 'abc\n' | od -tx1 0000000 61 62 63 0a 0000004 

шестнадцатеричного

 $ echo -en 'abc\n' | hexdump -C 00000000 61 62 63 0a |abc.| 00000004 

# 2. Кот

Если я поместил строку 'abc \ n' в файл, например:

 1: abc 2: 

Это строка со строкой abc на ней, за которой следует строка ( \n aka. 0x0A ). Затем проведите его до sed как и прежде, я получаю следующее:

 $ cat abc.txt | sed -n 'N;p' abc $ 

Это результат, который включает строку abc за которой следуют 2 строки.

od – восьмеричная свалка

 $ cat abc.txt | od -tx1 0000000 61 62 63 0a 0a 0000005 

шестнадцатеричного

 $ cat abc.txt | hexdump -C 00000000 61 62 63 0a 0a |abc..| 00000005 

Я немного недоумеваю, что происходит?

ОБНОВИТЬ

ОК, поэтому моя проблема заключалась в том, как я создавал файл abc.txt как указывал @choroba . Я создавал файл в vim и не понимал, что он добавляет 2 строки. Когда я включил видимость специальных символов, это стало немного более очевидным:

 :set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<, :set list 

Теперь в файле vim файл abc.txt выглядит так:

 abc$ $ 

Если бы я создал файл как предложенный @choroba, тогда файл abc.txt появился, как ожидалось:

 $ cat abc.txt | od -tx1 0000000 61 62 63 0a 0000004 

И это было похоже на исходный пример echo :

 $ cat abc.txt | sed -n 'N;p' $ 

Исходный выпуск

Моя первоначальная проблема с тем, почему sed -n 'N;p' не отображал ничего, ответил на ответ @ enzotib . Бит из стандарта POSIX – это то, что я не собирал:

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

2 Solutions collect form web for “Почему непоследовательность с использованием cat и echo для этой команды sed?”

Стандарт POSIX гласит:

[2addr] N Добавить следующую строку ввода, минус ее завершающую <новую строку>, в пространство шаблонов, используя встроенную <новую строку>, чтобы отделить прилагаемый материал от исходного материала. Обратите внимание, что номер текущей строки изменяется. Если нет следующей строки ввода, глагол команды N должен вступить в конец сценария и выйти без запуска нового цикла или копирования пространства шаблонов на стандартный вывод .

поэтому поведение очень отличается, если есть или нет следующая строка.

Ваш вход, как вы можете видеть из вывода od -x , отличается только в новой строке.

Как вы создали файл? Он содержит две строки, а не одну. Повторите попытку

 echo abc > abc.txt cat abc.txt | sed -n 'N;p' 
  • Удалить строку, содержащую нечувствительность к регистру
  • Удалить последнюю строку из файла
  • Подсчет количества записей в столбце 2, где столбец 1 аналогичен
  • Как добавить строку в первый столбец файла матрицы?
  • Sed Заменить в определенной группе позиций
  • Измените текст в теге, но только тег содержится в определенном блоке XML
  • Как печатать пустые места в первом столбце с помощью awk или sed
  • редактировать файл repo с sed
  • Как искать и заменять строки, соответствующие списку заметок для нескольких файлов
  • команда sed для добавления другого текста при множественном вводе строки
  • Как правильно избежать этой длинной команды su + sed?
  • Linux и Unix - лучшая ОС в мире.