Почему непоследовательность с использованием 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' 
  • Удалить определенное слово и пробел
  • Задача сравнения регулярных выражений / шаблонов для извлечения данных
  • Создание шаблона регулярного выражения для grep
  • Замена шаблона после n-го совпадения найдена в каждой строке?
  • Можно ли изменить файл в директории только для чтения?
  • Требуется sed для удаления знаков препинания
  • Почему это добавляет пробелы? echo "x ax" | sed 's / x \ s * / x /'
  • Переименование файлов с номерами в соответствующие 1-n числа в порядке
  • Как получить строки от 10 до 100 из 200-строкового файла в новый файл
  • Как я могу использовать регулярное выражение для извлечения текста, следующего за двумя условиями, в переменную?
  • Как я могу запустить sed для замены строк в файле или делать подобные вещи в PHP?
  • sed заменить текст url на html url
  • Linux и Unix - лучшая ОС в мире.