Почему sed удаляет последнюю строку?

$ cat file.txt
one
two
three
$ cat file.txt | sed "s/one/1/"
1
two

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

ОБНОВЛЕННЫЙ: нет никакой строки после слова "три".

5
задан Volodymyr Bezuglyy 3 March 2010 в 16:46
поделиться

5 ответов

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

Обновление

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

cat file.txt | perl -pe 's/one/1/'
1
ответ дан 14 December 2019 в 04:36
поделиться

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

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

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

4
ответ дан 14 December 2019 в 04:36
поделиться

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

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

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

1
two
three$
0
ответ дан 14 December 2019 в 04:36
поделиться

вот решение awk

awk '{gsub("one","1")}1' file.txt
0
ответ дан 14 December 2019 в 04:36
поделиться

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

1
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: