Подстановочный знак не раскрывается в цикле for с переменной

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
2
21.09.2020, 18:38
1 ответ

Подстановка файлов не выполняется внутри двойных кавычек (или одинарных кавычек, если уж на то пошло ).

Вы можете изменить его на:

fruit=(apple orange banana)
for f in "${fruit[@]}"
do
        set -- "${s}_"*.txt
        mv "$1" "${1%.txt}.out"
done

Так как подстановка файлов не будет выполняться внутри кавычек, это немного сложно, и благодаря предложению Кусалананды я использовал здесь встроенную функцию setдля выполнения подстановки в файле и установил ее как позиционный параметр, который затем мы можем использовать для выполнения манипуляций с расширением. Если существует возможность наличия нескольких совпадающих файлов, этот сценарий можно изменить либо с помощью утилиты rename, либо с помощью другого вложенного цикла для работы со всеми ними, в противном случае, как есть, будет переименовано только первое совпадение.

В вашей текущей версии, если файл .outеще не существует или есть несколько совпадений, этот скрипт не будет работать так, как вы хотите. Если вы просто хотите изменить расширение, но сохранить номер, вы можете использовать расширение параметра оболочки, чтобы просто удалить .txt, а затем добавить .out.

Кроме того, нет необходимости использовать запятые в объявлении массива, элементы будут разделены пробелами. Это если ваши имена файлов на самом деле не содержат буквальный символ запятой.

2
18.03.2021, 23:03

Теги

Похожие вопросы