Я новичок в awk.У меня есть файл, который выглядит так:
beans and celery
beans and oatmeal
beans and beans
quinoa
<fo:external-graphic width="auto" height="auto" content-width="36pt" src="url(file:/C:/Users/xxx/images/tip.svg)"/>
<fo:external-graphic src="url(images/image1.png)" width="6.3in" height="auto" content-width="246px" content-height="322px"/>
Я пытаюсь выполнить поиск и заменить на месте тег "fo".Я хочу захватить начало тега, а также параметр "src".Обратите внимание, что положение тега src варьируется от строки к строке!
Я смог получить нужные поля, используя следующее:
awk '/<fo:external-graphic.*/ {for (i=1; i<=NF; ++i) {if ($i ~ "src") print $1 " " $i}}' inventory.txt
Как я могу сделатьзамена этого на месте?Я также хочу добавить строку к новому содержимому строки.Я пробовал:
awk '/<fo:external-graphic.*/ {for (i=1; i<=NF; ++i) {if ($i ~ "src") print $1 " " $i "misc stuff here"}}' inventory.txt
Но это полностью портит порядок получающейся строки, которую я хочу иметь в форме:
<fo:external-graphic src="url(images/image1.png)" misc stuff here
PS1: Дополнительные пояснения о том, чтоРезультат, который я хочу: Файл содержит строки вроде:
<fo:external-graphic width="auto" height="auto" content-width="36pt" src="url(file:/C:/Users/xxx/images/tip.svg)"/>
<fo:external-graphic src="url(images/image1.png)" width="6.3in" height="auto" content-width="246px" content-height="322px"/>
Я хочу обработать их и получить вывод, например:
<fo:external-graphic src="url(images/image1.png)" _completely new stuff here, till end of string_ />
, например:
<fo:external-graphic src="url(images/image1.png)" age="25" sex="M" />
Я хочу, чтобы результат ВСЕГДА начинался с:
<fo:external-graphic src="url(images/image1.png)"
, затем дополнительный материал, например:
age="25" sex="M" />
Никакая другая часть исходной строки не требуется в конечном выводе.
PS2: Можно ли упаковать все это в gsub?Насколько мне известно, gsub принимает только два аргумента.Я пытался составить сложное выражение для аргумента замены, но оно не работает, например:
gawk '/<fo:external-graphic.*/ {for (i=1; i<=NF; ++i) {if ($i ~ "src") gsub($0, "boy band"); {print}}}' inventory.txt > testres
PS3: Это всего лишь наблюдение новичка, может быть, я ошибаюсь.Рассмотрим файл со следующим содержимым:
Donald Trump
Donald Duck
George Bush
Steve Austin
Регулярное выражение для поиска всех строк, начинающихся с Дональда:
/^Donald/
Если я хочу заменить все вхождения «Дональд»с "Barrack" я мог бы сделать следующее:
gawk -i inplace '{ gsub(/^Donald/, "Barrack"); { print } }' FILENAME
Если я хочу полностью изменить все строки, которые содержат "Donald", я бы сделал:
gawk -i inplace '{ gsub(/^Donald.*/, "Barrack"); { print } }' FILENAME
gawk и gsub, по-видимому, заменяют только span или любую часть строки, соответствующую заданному регулярному выражению.Таким образом, если я хочу полностью изменить всю строку, мое регулярное выражение должно охватывать всю эту строку.
PS4: Просто чтобы устранить любые неясности в отношении ожидаемого решения.Учитывая следующий файл:
<fo:external-graphic width="auto" height="auto" content-width="36pt" src="url(file:/C:/Users/xxx/images/tip.svg)"/>
<fo:external-graphic width="6.3in" height="auto" src="url(images/image1.png)" content-width="246px" content-height="322px"/>
<fo:external-graphic src="url(images/image1.png)" width="6.3in" content-width="246px" content-height="322px"/>
Я ищу решение awk / gawk, которое заменит этот файл на:
<fo:external-graphic src="url(file:/C:/Users/xxx/images/tip.svg)" age="25" sex="M" />
<fo:external-graphic src="url(images/image1.png)" age="25" sex="M"/>
<fo:external-graphic src="url(images/image1.png)" age="25" sex="M"/>
Целевой файл должен быть изменен .