Почему sed удаляет последнюю строку? - PullRequest
5 голосов
/ 03 марта 2010
$ cat file.txt
one
two
three
$ cat file.txt | sed "s/one/1/"
1
two

Где слово "три"?

ОБНОВЛЕНИЕ: После слова «три» нет строки.

Ответы [ 6 ]

4 голосов
/ 03 марта 2010

Как предположил Иван, в вашем текстовом файле отсутствует маркер конца строки (EOL) на последней строке.Поскольку этого нет, three распечатывается с помощью sed, но затем сразу перезаписывается вашим приглашением.Это можно увидеть, если принудительно напечатать дополнительную строку.

sed 's/one/1/' file.txt && echo

Это распространенная проблема, поскольку люди неправильно воспринимают EOL как признак наличия следующей строки (именно поэтому ее обычно называют"новая строка"), а не как указание на то, что текущая строка закончилась.

2 голосов
/ 26 сентября 2011

Использование комментариев из других постов:

  1. более старые версии sed не обрабатывают последнюю строку файла, если отсутствует EOL или «новая строка».
  2. Эхо может использоваться для добавления новой строки

Затем, чтобы решить проблему, вы можете изменить порядок команд:

( cat file.txt && echo ) | sed 's/one/1/'
1 голос
/ 04 марта 2010

Поиск в Google показывает, что страница руководства для некоторых версий sed (не для версий GNU или BSD, которые работают так, как вы ожидаете) показывает, что она не будет обрабатывать неполную строку (ту, которая не заканчивается на новую строку) в конце файла. Решение состоит в том, чтобы ваши файлы заканчивались символом новой строки, устанавливали GNU sed или использовали вместо этого awk или perl.

1 голос
/ 03 марта 2010

Полагаю, нет символа новой строки после последней строки. sed не нашёл разделитель строк после последней строки и проигнорировал его.

Обновление

Я предлагаю вам переписать это в perl (если он у вас установлен):

cat file.txt | perl -pe 's/one/1/'
0 голосов
/ 04 марта 2010

вот решение awk

awk '{gsub("one","1")}1' file.txt
0 голосов
/ 03 марта 2010

Вместо катания файла и передачи в sed, запустите sed с именем файла в качестве аргумента после строки подстановки, например:

sed "s/one/1/" file.txt

Когда я сделал это таким образом, я получил «три», сразу же после подсказки:

1
two
three$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...