Пользователь richard очень хорошо описывает, что не так с вашей командой sed
, а также дает правильный сценарий редактирования для выполнения действия, которое вы пытаетесь выполнить.
Я предлагаю альтернативный подход, который будет работать в нескольких различных случаях:
Команда sed
r
вставит содержимое файла в текущую позицию в потоке данных.
В командной строке sed
можно написать
$ sed '115r /dev/stdin' index.html <data.in
, что даст тот же эффект, что и sed '115r data.in' index.html
.. ..если данные, которые вы хотели вставить после строки 115, были сохранены в файле data.in
.
/ dev / stdin
- это специальный файл, содержащий все, что отправлено через стандартный ввод.
Вы также можете сделать (с оболочками, поддерживающими "здесь-строки"):
$ sed '115r /dev/stdin' index.html <<<"my string of stuff"
или
$ sed '115r /dev/stdin' index.html <<<"$myvariableofwonder"
Это также работает, как ожидалось, с конвейером из других команд, очевидно:
$ sed -n '1,10p' myfile | sed '115r /dev/stdin' index.html
Это трансплантирует строки с 1 по 10 из myfile
в index.html
в строке 115.
Вам необходимо инициализировать MODE
как некоторое значение, отличное от SMTH
, SMTH2
и SMTH3
. Затем проверьте, находится ли MODE в начальном значении. Если нет, выдайте сообщение об ошибке и выйдите. Вы должны выйти после ошибки, иначе скрипт продолжит выполняться. Модифицированная версия вашего скрипта, приведенная ниже, должна помочь вам начать работу.
MODE=0
EMSG="More than one of -d, -e, -f has been specified"
while getopts "a:b:c:def" variable; do
case $variable in
a) a=$OPTARG ;;
b) b=$OPTARG ;;
c) c=$OPTARG ;;
d) if [ $MODE = 0 ] ; then MODE=SMTH ; else echo $EMSG ; exit 1 ; fi ;;
e) if [ $MODE = 0 ] ; then MODE=SMTH2 ; else echo $EMSG ; exit 1 ; fi ;;
f) if [ $MODE = 0 ] ; then MODE=SMTH3 ; else echo $EMSG ; exit 1 ; fi ;;
esac
done