$ cat file.txt
one
two
three
$ cat file.txt | sed "s/one/1/"
1
two
Где слово "три"?
ОБНОВЛЕННЫЙ: нет никакой строки после слова "три".
Я думаю, что после последней строки нет символа новой строки . sed
не нашел разделитель строк после последней строки и проигнорировал его.
Обновление
Я предлагаю вам переписать это на perl (если он у вас установлен):
cat file.txt | perl -pe 's/one/1/'
Как предположил Иван, в вашем текстовом файле отсутствует маркер конца строки (EOL) в последней строке. Так как этого нет, команда sed выводит three
, но затем сразу же перезаписывает ваше приглашение. Вы можете увидеть это, если принудительно напечатаете дополнительную строку.
sed 's/one/1/' file.txt && echo
Это обычная проблема, поскольку люди ошибочно считают EOL указанием на наличие следующей строки (поэтому ее обычно называют «новой строкой»), а не указанием на то, что текущая строка закончилась.
Вместо того, чтобы обрабатывать файл и передавать его в sed, запустите sed с именем файла в качестве аргумента после строки подстановки, например:
sed "s/one/1/" file.txt
Когда я сделал это таким образом, я получил «тройку» сразу после приглашения:
1
two
three$
Поиск в Google показывает, что в man-странице некоторых версий sed (не GNU или BSD, которые работают так, как вы ожидаете) указано, что он не будет обрабатывать неполную строку (не завершенную новой строкой) в конце файла. Решение - убедиться, что ваши файлы заканчиваются новой строкой, установить GNU sed или использовать awk или perl вместо него.