Перепишите команду sed для редактирования потока вместо файла

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

./somecommand | sed 's/xx/yy/g'

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

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

./somecommand > file
sed -e 's/^/s|/; s/$/|g/;' replacement_list | sed -r -f - -i file

По сути, первая команда sed создает список операций sed из файла с парами замен. Затем вторая команда sed использует поток через конвейер и использует параметр -f для обработки файла.

С тех пор ситуация немного изменилась, и теперь мне удалось заставить somecommand выводить результаты в stdout вместо записи в файл, но я не могу придумать способ правильно переписать приведенный выше набор команд. Часть сложности заключается в том, что вторая команда sed уже использует поток из первой команды sed.

Одна вещь, которую я пробовал, - это присвоить stdout из somecommand переменной и попытаться <<< во второй команде sed. Однако это не сработало.


person Reuben L.    schedule 18.09.2014    source источник


Ответы (1)


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

./somecommand | sed -r -e "`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"

Обратите внимание на обратные кавычки внутри двойных кавычек, это приведет к тому, что стандартный вывод внутренней команды sed будет помещен в двойные кавычки.

Хотя это опасно, поэтому вы можете попробовать сначала сохранить вывод внутренней команды sed в переменную оболочки, как это

sedcommand="`sed -e 's/^/s|/; s/$/|g/;' replacement_list`"
./somecommand | sed -r -e "$sedcommand"
person randomusername    schedule 18.09.2014
comment
./somecommand | sed -r -e "$( sed -e 's/^/s|/; s/$/|g/;' replacement_list )" больше не нужно экранировать внутри двойной кавычки или использовать двойную кавычку вместо простой или любой обратной косой черты ОС с несколькими вхождениями, например s/\\\\/\\\\\\\\/g - person NeronLeVelu; 19.09.2014