Вы можете использовать sed таким образом с переменными параметрами:
# book title:author to be searched
BOOK="Hello World:Andreas"
# price to be updated
PRICE=11.25
# search and update with original backed up with .bak extension
sed -i.bak 's/\('"$BOOK"'\):[^:]*:/\1:'"$PRICE"':/' file.txt
Объяснение:
Если вы введете переменные оболочки в команду sed, это будет выглядетьэто:
sed 's/\(Hello World:Andreas\):[^:]*:/\1:11.25:/'
match
"$BOOK" # match literal text i.e. Hello World:Andreas
\($BOOK\) # group this text to be back referenced later
: # match literal :
[^:]* # match 0 or more characters until : is found
: # match a :
замена
\1 # group # 1 i.e. Hello World:Andreas
: # a literal :
$PRICE # fill in the new price
: # literal :
По сути, эта команда sed находит текстHello World:Andreas:
, затем , некоторое значение цены , а затем еще 10 *.Как только этот шаблон найден, он заменяет его обратной ссылкой # 1 (которая Hello World:Andreas
), затем :
, а затем помещает новое значение цены и двоеточие :
.
* 1030.* РЕДАКТИРОВАТЬ: Настоятельно рекомендуется прочитать некоторые учебники sed, однако, согласно вашему комментарию, я предоставляю вам команду для обновления количества:
# book title:author to be searched
BOOK="Hello World:Andreas"
# quantity to be updated
QTY=18
# search and update with original backed up with .bak extension
sed 's/^\('"$BOOK"'\):\([^:]*\):[^"]*:/\1:\2:'"$QTY"':/'