Есть два другие подходы, о которых вы, возможно, захотите узнать, поскольку не все команды будут поддерживать трюк -
.
Первый имеет функцию, которая работает с потоками и не принимает файл в качестве входа. Вы можете сделать это путем удаления $ 2 в конце концов, и изменения, как вы вызываете функцию
f_highlite() {
sed -e 's/\($1\)/\o033[91m\1\o033[39m/g'
}
f_highlite <"Xms"
Это будет перенаправлять содержимое файла и подключить его к стандартному входу функции (и, следовательно, к тому, что из sed
).
Другой подход заключается в том, чтобы сохранить вашу функцию как есть (я повторно использую исправление цитирования, предложенное в другом ответе), но загружайте файл с помощью замены процесса.
f_highlite() {
sed -e "s/\($1\)/\o033[91m\1\o033[39m/g" "$2"
}
f_highlite < <(<"Xms")
Это (по крайней мере, концептуально) создает буфер FIFO, который имеет свой вход подается с содержимым файла, а его выход подключен к входу функции. Ключ здесь состоит в том, что <(<"Xms")
становится именем файла (вы можете попробовать распечатать его имя, чтобы подтвердить это).
Когда вы запускаете цепочку труб, что вы ожидаете? Что на самом деле происходит? Что, если есть, сообщения об ошибках вы получаете? Каков ожидаемый и фактический результат? Наконец, помните, что переменные (например, '$ 1') не расширяются внутри строк с одним кавычком (например,' echo '$ 1'' внутри функции печатает буквальный '$ 1', а не расширяется до первого аргумента). –
Я ожидаю, что эта функция (которую я плохо назвал:]) выделит _searched string_. Например, у меня есть команда loooong java и вы хотите выделить параметр * Xms *. Я забыл правило о строках с одним кавычком, которое было правильным по hek2mgl в ответе. – waldauf
@waldauf Имейте в виду, что вам нужно убедиться, что первый аргумент правильно экранирован; Строгие команды 'sed' динамически не являются тривиальной задачей. – chepner