Что заставляет вас думать, что $@
будет хранить что-либо после того, как вы используете read
для чтения в cur
? Поскольку вы снова читаете его в цикле, результат зависит от того, с какими аргументами вы запускаете этот скрипт, поскольку это то, что означает $@
.
Если вы можете быть уверены, что строка i )всегда будет заключена в двойные кавычки и никогда не будет содержать "
, а ii )всегда будет находиться только в одной строке, то это тривиально:
$ sed -E 's/title=("[^"]*")/& alt=\1/' file
<p class="images"><img src="my-favorite-pencil.jpg" title="best-pencil" alt="best-pencil">
Хитрость заключается в том, чтобы искать title="
, за которым следует 0 или более не-"
до следующего "
и «захватывать» это (, это то, что скобки вокруг ("[^"]*")
делают ), поэтому мы можем затем ссылайтесь на него как \1
. В sed
символ &
означает «все, что было сопоставлено». Итак, здесь мы заменяем title="foo"
самим собой, а затем alt="foo"
.
Если у вас есть версия sed
, которая не поддерживает -E
, вы можете использовать ее вместо:
$ sed 's/title=\("[^"]*"\)/& alt=\1/' file
<p class="images"><img src="my-favorite-pencil.jpg" title="best-pencil" alt="best-pencil">