Как извлечь текст из файла в переменную, а также заменить этот текст маркером? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть файл property: value; пар (это CSS).Я хочу пройти через этот файл и регулярно извлекать определенные значения в переменные оболочки, заменяя текст в файле маркером.

Например, для FILE1:

position: float;
background: url("data:image/loremipsum");
height: auto;
background: url("data:image/loremipsum2");

И, скажем, я хочу извлечь и сохранить URL-адреса изображения в массив:

FILE1=path/to/file1
URL[0]=$(echo "$FILE1" | grep "data:image" | awk ???)
# Expected: "data:image/loremipsum"
URL[1]=$(echo "$FILE1" | grep "data:image" | awk ???)
# Expected: "data:image/loremipsum2"

И затем, откуда яизвлек текст, этот текст заменяется на «MARKER0», «MARKER1» и так далее.

Я предполагаю, что решение для этого будет включать awk, но я набрал man awk, и моя голова почти отвалилась.Предполагая, что я знаю, как написать регулярное выражение для этого, с чего мне начать?

Нужен ли мне awk?Нужен ли цикл для перебора всех значений изображения?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Думаю, я бы использовал более простые инструменты.В этом случае grep -o и bash массивы.(Вы не указали, какую оболочку вы используете, поэтому я предполагаю, что это bash.)

images=($(egrep -o 'data:image/[^"]+' input.css))

Или, если вы предпочитаете:

images=($(egrep -o 'url\("data:image/[^"]+"' input.css))
images=(${images[@]#url(\"}); images=(${images[@]%\"})

Они оба создают массив, images[], который можно просматривать несколькими способами:

$ declare -p images
declare -a images='([0]="data:image/loremipsum" [1]="data:image/loremipsum2")'
$ printf '%s\n' "${images[@]}"
data:image/loremipsum
data:image/loremipsum2

Сейчас .. данные: изображения / значения не должны содержать пробелы.Если это произойдет, у этого решения возникнут проблемы, поскольку содержимое массива по умолчанию разделяется на пробелы.Если вы ДЕЙСТВИТЕЛЬНО считаете, что вам нужно сохранить пробелы, вы можете сделать это, прочитав введенные вами данные в цикле:

$ cat input.css
position: float;
background: url("data:image/loremipsum");
height: auto;
background: url("data:image/loremipsum 2");
$ images=(); while read -r; do images+=("$REPLY"); done < <(egrep -o 'data:image/[^"]+' input.css)
$ declare -p images
declare -a images='([0]="data:image/loremipsum" [1]="data:image/loremipsum 2")'

Если ваши значения содержат символы новой строки ... тогда вы сами по себе.: -)

0 голосов
/ 15 февраля 2019

Не могли бы вы попробовать следующее.

arr=($(awk '/background/ && match($0,/\".*\"/){print substr($0,RSTART+1,RLENGTH-2)}' Input_file))
OR to use a variable's value for awk as an input then try following.
arr=($(echo "$VAR" | awk '/background/ && match($0,/\".*\"/){print substr($0,RSTART+1,RLENGTH-2)}'))

Чтобы напечатать значения массива, попробуйте затем выполнить следующее.

for i in "${arr[@]}"
do
  echo "$i"
done

Или распечатать в правильном значении индекса элемента тоже с печатью массиваЗначение попробуйте следующее.

count=0
for i in "${arr[@]}"
do
  echo "arr["$count"]=$i"
  count=$((count + 1))
done


РЕДАКТИРОВАТЬ: Поскольку OP говорит, что между значениями может быть пробел.Таким возможным решением для этого может быть печать значений из команды awk с новым символом между значениями (который будет работать как разделитель полей для итераций массива BASH), я взял %, поэтому при запуске команды awk она выдастследует (используя тестовые значения в выводе, показанном здесь)

awk '/background/ && match($0,/\".*\"/){val=val?val "%" substr($0,RSTART+1,RLENGTH-2):substr($0,RSTART+1,RLENGTH-2)} END{print val}' Input_file

singh:test/ bla_bla_bla%singh:bla1/bla2

Запустите следующую команду, чтобы создать массив с именем arr.

arr=($(awk '/background/ && match($0,/\".*\"/){val=val?val "%" substr($0,RSTART+1,RLENGTH-2):substr($0,RSTART+1,RLENGTH-2)} END{print val}' Input_file))

Теперь, если мы установим IFS='%' и запустим следующеекоманда.

echo "${arr[0]}"
singh:test/ bla_bla_bla
echo "${arr[1]}"
singh:bla1/bla2

Так как он принял новый разделитель как %, поэтому он НЕ сломает значения, для которых есть пробел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...