Попасть в строку из текстового файла и отредактировать ее - PullRequest
1 голос
/ 26 января 2012

Возможно, у меня есть эта строка в моем текстовом файле, который имеет следующий формат.

"Title:Author:Price:QtyAvailable:QtySold"

Содержимое моего текстового файла показано ниже

 Hello World:Andreas:10.50:10:5
 Lord Of The Rings:Duke:50.15:50:20
    (some other records...)

1) Пользовательские вводы Автори Название.

2) Если Программа находит Автора + Название, она просит пользователя обновить любое из доступных полей (для этого случая Название, Автор, Цена и т. д.

3) ДляНапример, я хотел бы обновить книгу «Цена Hello World».

4) Что я могу сделать, чтобы программа сказала извлечь содержимое строки Hello World и войти в 10.50, чтобы заменить цену книги??(предполагается, что новая цена книги будет определяться пользовательским вводом)

Надеюсь получить мой ответ.Заранее спасибо тем, кто помог!

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Вы можете использовать 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"':/'
0 голосов
/ 26 января 2012

Ниже приведено кое-что, с чего можно начать:

Пример сценария:

[jaypal:~/Temp] cat s.sh 
#!/bin/bash

echo "Author?"
read author

echo "Title?"
read title

grep -c "$title:$author" file > /dev/null # Look for a line with matching values

if [ $? == 0 ]; then # If found then offer to change price
    echo "I found the book, Do you want to update price to what?"
    read newprice
    sed -i "s/\($book:$author\):[^:]*:/\1:$newprice:/" file
fi

Входные данные:

[jaypal:~/Temp] cat file
Hello World:Andreas:10.50:10:5
Lord Of The Rings:Duke:50.15:50:20

Исполнение:

[jaypal:~/Temp] ./s.sh 
Author? 
Andreas
Title? 
Hello World
I found the book, Do you want to update price to what?
40
[jaypal:~/Temp] cat file
Hello World:Andreas:40:10:5
Lord Of The Rings:Duke:50.15:50:20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...