Случай подобен этому: Добавление строки, содержащей символ ESC с sed
Я предлагаю тот же (адаптированный) ответ:
for file in "${filelist[@]}"; do
sed -i "1i\\
$(echo -E "$prefix" | sed -e 's/\\/\\\\/g' | sed -e '$! s/$/\\/')" "$file" &&
echo "$suffix" >> "$file"
done
sed
команда i
требует, чтобы каждая строка кроме последнего была завершена с обратной косой чертой (это отсутствовало в отнесенном ответе). Кроме того, обратные косые черты должны быть удвоены, таким образом, sed
не попытается интерпретировать их. echo
производит содержание переменной $prefix
. Затем в конвейере, sed
команда удваивает обратные косые черты. Второе sed
команда добавляет обратные косые черты в конце каждой строки кроме последнего.
ОТРЕДАКТИРУЙТЕ Как sed программа $! s/$/\\/
работы:
Во-первых, адрес $
средства выполнить команду, которая следует последняя строка. $!
инвертирует это, таким образом, команда будет выполняться на всех строках кроме последнего.
Затем s///
команда делает замену. Это заменит пустой строкой в конце строки, обозначенной $
, с обратной косой чертой. Но обратная косая черта является специальным символом, таким образом, мы должны выйти из нее с другой обратной косой чертой для sed
считать его правильно.
Используйте это:
vishex ()
{
[ -e "$1" ] || echo -e '#!/bin/bash\n\n' > "$1";
chmod +x "$1";
vi "+normal G" +startinsert "$1"
}
[ -e "$1" ]
проверяет, существует ли уже скрипт. Если да, то echo
не отменит его. -e
в echo позволяет интерпретировать обратные косые черты, например \n
для новой строки. Затем он вставляет 2 новые строки после строки shebang. +normal G
запускает команду ex G
, которая переходит к последней строке в файле. +startinsert
переключает непосредственно в режим вставки (можно и оставить, так как в вопросе это не упоминается). Итак, при выполнении vishex script
это выглядит так:
#!/bin/bash
<- cursor is here
~
[...]
~
-- INSERT -- 3,1 All
Предполагая, что ваш vi на самом деле vim , из справочной страницы:
+[num] For the first file the cursor will be positioned on line "num".
If "num" is missing, the cursor will be positioned on the last line.
Таким образом, используйте:
vi + "$1"