регулярное выражение awk и добавление 1

#bash #shell #terminal #awk

#bash #оболочка #терминал #awk

Вопрос:

У меня есть HTML-файл с некоторыми массивами переменных, которые мне нужно увеличить. Я делал это вручную, но сейчас это занимает слишком много моего времени. Я искал и пытался найти правильный инструмент / синтаксис, чтобы делать именно то, что я хочу.

скажем, у меня есть:

 file[0]=["blah0 blah0", "file0.jpg"]
file[1]=["blah1 blah1", "file1.jpg"]
file[2]=["blah2 blah2", "file2.jpg"]
 

Что я хотел бы сделать, так это чтобы скрипт добавил единицу к номеру переменной, что дало мне возможность добавить больше переменных раньше. Я мог бы указать 5 и получить результат

 file[5]=["blah0 blah0", "file0.jpg"]
file[6]=["blah1 blah1", "file1.jpg"]
file[7]=["blah2 blah2", "file2.jpg"]
 

Это то, что я пробовал до сих пор, но не очень удачно … поскольку оно удаляет все квадратные скобки

 awk -F [][]  '/^file[[0-9] ]=/ {$2="["$2 '$userinput'"]";}1' ${workdirect}/index.html > text.txt
 

Любой совет???

Комментарии:

1. Хм. Вы хотите сделать некоторое дополнение. Я не знаю о регулярном выражении, которое могло бы выполнить такую вещь. Возможно, вам нужно использовать хотя бы какой-нибудь язык сценариев.

2. awk — это язык сценариев…


Ответ №1:

 #!/bin/bash
FILE=$1

awk '/^file/ {
  m = match($0, "[[0-9] ]");
  if (m) {
    printf("%s%d%sn",
           substr($0, 0, RSTART),
           INC   substr($0, RSTART   1, RLENGTH - 2),
           substr($0, RSTART   2, length($0) - RSTART))
  }
}' INC=$2 $1

$ foo.sh tmphtml 5
file[5]=["blah0 blah0", "file0.jpg"]
file[6]=["blah1 blah1", "file1.jpg"]
file[7]=["blah2 blah2", "file2.jpg"]
 

Комментарии:

1. Похоже, что он будет делать то, что я хочу, но когда я запускаю его — после file [14] он начинает выводить случайные числа 14, 150, 161, 172, 183… Есть идеи???

2. Извините, я виноват. Измените последний substr на substr($0, RSTART RLENGTH - 1, length($0) - RSTART)) , и он будет работать для всех чисел.

3. Приятно! И это на самом деле не ваше плохое — вы шли с информацией, которую вам дали!

Ответ №2:

Пусть script будет

 #!/bin/bash
inc=$1
while read line; do
  p1=${line%%[*}
  p3=${line#*]}

  p2=${line#*[}
  p2=${p2%%]*}
  p2=$(( ${p2}   $inc ))

  echo $p1[$p2]$p3
done
 

Вызов script

 $ script offset < inputfile
 

Это просто bash, никаких накладных расходов на внешние компоненты.

Ответ №3:

Проще с perl:

 perl -nle '$n = 5; /(file[)([[:digit:]] )(]=[.*])/; print $1, $2   $n, $3'
 

Комментарии:

1. Еще проще: perl -pe 's/d /$amp; 5/e'

Ответ №4:

Если первая строка действительно начинается с file[0]= и все последовательно, то это может сработать:

 awk 'sub(/[0-9] /,'$userinput' t) {print; t=t 1}' ${workdirect}/index.html > text.txt