Выполнить sed, не требуя символа новой строки в потоке - PullRequest
4 голосов
/ 06 мая 2011

Заметил это несколько раз, когда я передаю что-то в sed, который не содержит символов новой строки, sed не выполняется.

Пример, поток содержит некоторый текст (без новой строки)

foo

Команда:

$echo -n "foo" | sed 's/foo/bar/'

ничего не выводит.

Принимая во внимание, что если я добавлю символ новой строки в конец потока, приведенная выше команда выведет ожидаемую замену:

$echo "foo" | sed 's/foo/bar/'
bar

Я обнаружил много ситуаций, когда у меня их нет, и я действительно не хочу символа новой строки в моем потоке, но я все еще хочу запустить замену sed.

Буду признателен за любые идеи, как это можно сделать.

Ответы [ 2 ]

1 голос
/ 06 мая 2011

В какой среде вы находитесь? Что sed вы используете?

Потому что здесь у меня получше sed:

$ echo -n foo | sed 's/foo/bar/'
bar$ 
$ echo -n foo > test.txt
$ hexdump -C test.txt
00000000  66 6f 6f                                          |foo|
00000003
$ cat test.txt | sed 's/foo/bar/'
bar$ cat test.txt | sed 's/foo/bar/' | hexdump -C
00000000  62 61 72                                          |bar|
00000003
$ sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

Обратите внимание, что один из способов получить sed - набрать его как perl -pe, например:

$ cat test.txt | perl -pe 's/foo/bar/' | hexdump -C
00000000  62 61 72                                          |bar|
00000003
0 голосов
/ 06 мая 2011

sed должен знать, когда ввод завершен, поэтому он ищет либо Конец файла, либо Конец строки, на самом деле не существует способа обойти это.

...