sed
— это правильный способ сделать это, даже если вы сказали, что по какой-то причине не хотите использовать sed
.
Сценарий sed будет выглядеть так
$i\
this is test4\
this is test5
и вы бы запустили это как sed -f script.sed file
. Команда i
вставляет строки перед адресуемой строкой, а команда $
адресует последнюю строку файла.
Как «один -вкладыш» с использованием GNUsed
:
$ sed -e '$i\' -e ' this is test4\' -e ' this is test5' file
{
This is test1
this is test2
this is test3
this is test4
this is test5
}
В зависимости от того, является ли файл на самом деле файлом JSON или в каком-либо другом структурированном текстовом формате, могут быть инструменты, такие как jq
, которые лучше подходят для управления им.
Использование echo
по вашему запросу (также предполагает, что вы используете head
из GNU coreutils, поскольку опция -n
обычно не принимает отрицательное число):
{ head -n -1 file
echo ' this is test4'
echo ' this is test5'
tail -n 1 file; } >newfile
Подстановка файлов не выполняется внутри двойных кавычек (или одинарных кавычек, если уж на то пошло ).
Вы можете изменить его на:
fruit=(apple orange banana)
for f in "${fruit[@]}"
do
set -- "${s}_"*.txt
mv "$1" "${1%.txt}.out"
done
Так как подстановка файлов не будет выполняться внутри кавычек, это немного сложно, и благодаря предложению Кусалананды я использовал здесь встроенную функцию set
для выполнения подстановки в файле и установил ее как позиционный параметр, который затем мы можем использовать для выполнения манипуляций с расширением. Если существует возможность наличия нескольких совпадающих файлов, этот сценарий можно изменить либо с помощью утилиты rename
, либо с помощью другого вложенного цикла для работы со всеми ними, в противном случае, как есть, будет переименовано только первое совпадение.
В вашей текущей версии, если файл .out
еще не существует или есть несколько совпадений, этот скрипт не будет работать так, как вы хотите. Если вы просто хотите изменить расширение, но сохранить номер, вы можете использовать расширение параметра оболочки, чтобы просто удалить .txt
, а затем добавить .out
.
Кроме того, нет необходимости использовать запятые в объявлении массива, элементы будут разделены пробелами. Это если ваши имена файлов на самом деле не содержат буквальный символ запятой.