![(команда sed)-> sed $foo](https://rvso.com/image/111991/(%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%20sed)-%3E%20sed%20%24foo%20.png)
Я пишу скрипт, который использует команду sed для замены в файле определенного идентификатора. В настоящее время скрипт имеет команды sed, жестко закодированные
Метод текущего измерения:
s*ed 's/@Number@/ ' "${Number}" '/g; s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g' File_Template > index.html*
В связи с тем, что команда sed больше не будет жестко закодирована, а мы запускаем много процессов с различными требованиями sed, я хотел бы сделать что-то вроде этого
Цель:
INITIALIZE_SED_COMMAND='s/@Number@/ ' "${Number}" '/g;
s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g;'
# Some logic happens here
INITIALIZE_SED_COMMAND="$INITIALIZE_SED_COMMAND File_Template > index.html" ;
sed $INITIALIZE_SED_COMMAND
Это работало на платформе Linux как .sh
скрипт, но мне нужно сделать это в . ksh unix
и я постоянно сталкиваюсь с проблемой невозможности его анализа.
ОШИБКА:
sed: Не удаётся найти или открыть файл s/@Number@/npdsfg/g;.
sed: Не удаётся найти или открыть файл s/@Value@/SQR.
sed: Не удаётся найти или открыть файл #s/@Socket/semi_/g;.
решение1
Это не следствие перехода с системы на базе Linux на какую-то не-Linux-систему (AIX, случаем?). Это фундаментальное непонимание того, как оболочка анализирует и выполняет команды.
Вы не можете написать это и ожидать, что это запишет временную метку в файл:
v="date > /tmp/date.txt"
$v
Аналогично вы не можете написать это и заставить его выполнять замены и записывать результаты в выходной файл.
v="s/abc/XYZ/ /tmp/source > /tmp/destination"
sed $v
Перенаправление файла не может быть указано внутри переменной.
Я думаю, вы ищете sed -f
, где можно создать файл замен и применить их к исходному файлу данных:
#!/bin/ksh
# Usage: thisprogram <transform_file> <src_file> <dst_file>
#
transform="$1"
src="$1"
dst="$2"
sed -f "$transform" "$src" >"$dst"
Файл преобразования может содержать такие операции:
s/@Number@/1234/g
s/@Value@/somevalue/g
s/@Socket@/99b44/g
Очевидно, вам придется подготовить это в контексте конкретной казни.
При наличии более подробных сведений в вашем вопросе это решение, возможно, можно будет усовершенствовать, но я надеюсь, что у вас достаточно информации, чтобы доработать его для вашего конкретного случая использования.