Заменять целое число в середине строки несколько раз (Bash Sed?)

Шаблон подстановки оболочки *не раскрывается в двойных кавычках. Это означает, что ваш цикл

for d in "${dir_array[@]}";do

зацикливается на паттернах . В вашем вызове dir_deleteвы используете шаблоны без кавычек, поэтому они будут развернуты там (, но никогда не попадут туда ). Однако функция будет использовать только первое слово того, что соответствует шаблону в вызове find.

Настоящая остановка шоу -заключается в том, что шаблоны также будут расширены в тесте [ -d $d ], что неудобно, так как тест -dвсегда принимает только одиночное имя пути. Вот, в конце концов, почему сценарий терпит неудачу.

Вместо этого убедитесь, что паттерны правильно расширены при назначении на dir_array:

.

dir_array=(
    /srv/*/folderA
    /srv/level1D/*/folderA
)

Если folderAили какая-либо другая часть пути содержит пробелы и т. д., эта часть пути должна быть заключена в кавычки, но *не должна заключаться в кавычки.

Также не забудьте заключить в двойные кавычки расширения всех переменных, если только вы не знаете, в каких контекстах их не нужно заключать в кавычки.

Возможны проблемы с цитированием следующих строк:

  • if [ -d $d ];then
  • find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
  • dir_delete $d

Также рассмотрите возможность использования printfвместо echoпри выводе переменных данных.

Связанные:

0
01.05.2020, 00:00
2 ответа

Вы можете сделать это с помощью awk:

echo '20601300929&Page=1&PageSize=96' |
awk -F "Page=" '
    {
        split($2,a,"&")
        for (i=int(a[1]);i<=100;i++){
            print $1 FS a[1]++ "&" a[2]
        }
    }'

Разделитель полей установлен на Page=, поэтому поле $2в нашем примере равно 1&PageSize=96.

Бит splitразбивает это второе поле на основе &и помещает в a[1]число, а в a[2]остальную часть строки(PageSize=96).

Наконец, в операторе печати все склеено.

3
28.04.2021, 23:17

Может быть, баш

num=96
counter=1
limit=100
var='20601300929&Page=#&PageSize=#'

while ((counter<=limit)); do
  if [[ $var =~ ([^\&]+)(\&[^\&]+)(.+) ]]; then
    printf '%s\n' "${BASH_REMATCH[1]}${BASH_REMATCH[2]/\#/$((counter++))}${BASH_REMATCH[3]/\#/$num}"
  fi
done


1
28.04.2021, 23:17

Теги

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