#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