Мой файл в настоящее время имеет
Name. Address. Phone number
Jack. L.A 1435672
John L.A. 1465432
Nick. F.l. 1489756
Когда пользователь хочет удалить контакт из списка, он вводит имя контакта, и программа удаляет целую строку. Когда пользователь хочет изменить контакт, он вводит имя, и найдите контакт и затем измените его с новым именем, адресом и номером телефона. Я пытаюсь достигнуть этого использования двух функций, удаляют и изменяют.
Можно использовать команду sed
с синтаксисом как как:
sed "/^\t$name/d" in-file
Где:
мы должны использовать двойные кавычки, когда в регулярном выражении должен передать переменную оболочки - $name
в этом случае.
^
будет соответствовать к началу строки.
\t
будет соответствовать к единственной вкладке.
команда d
в конце удалит каждую строку, которые соответствуют к нашему regexp /^\t$name/
.
Можно добавить -i
(или -i.bak
) создать изменения вместо файла (или и создать резервную копию). Или Вы можете Blueirect вывод команды в anotger файл и т.д.:
sed "/^\t$name/d" in-file -i.bak
sed "/^\t$name/d" in-file > out-file
Больше примеров:
$ name='Blue' # assign a value to the shell variable $name
$ cat in-file # output the content of the input file
first line
second line
Blue
fourth line
Blue
$ sed "/^\t*$name/d" in-file # remove the lines that begin ^ with 0 or more tabs followed by the value of $name
first line
second line
fourth line
$ sed -r "/^\t+$name/d" in-file # remove the lines that begin ^ with 1 or more tabs followed by the value of $name; enable extended regexp -r
first line
second line
fourth line
Blue
$ sed -r "/^\t{0,1}$name/d" in-file # remove the lines that begin ^ with 0 or 1 tabs followed by the value of $name; enable extended regexp -r
first line
second line
fourth line
$ sed -r "/^\t?$name/d" in-file # remove the lines that begin ^ with 0 or 1 tabs followed by the value of $name; enable extended regexp -r
first line
second line
fourth line
$ sed -r -e "/^(\t|\s|\s\t|\t\s)?$name/d" -e 's/^\t//' in-file # remove the lines that begin ^ with 0 or 1 tabs, or spaces, or spaces and tabs, or tabs and spaces`; remove the tabs in the beginning of the rest lines
first line
second line
fourth line
Править: Вот то, как заменить целой строкой от примера, обеспеченного в обновленном вопросе. Здесь используется sed
команда замены s/regexp/replacement/
.
Сначала давайте предположим, что мы определили следующие переменные наборов:
old_name='Jack.' old_address='L.A.' old_phone='1435672'
new_name='Tom.' new_address='F.l.' new_phone='875632'
Если мы нуждаемся в точном совпадении строки и хотим сохранить точный формат, мы можем использовать следующую команду, которая использует опцию групп получения: (...)
-> \1
, и т.д.; дополнительно опция -r
(используйте расширенные регулярные выражения), относится просто синтаксис (проверьте этот вопрос как ссылку):
sed -r "s/^(\t*|\s*)$old_name(\t*|\s*)$old_address(\t*|\s*)$old_phone(\t*|\s*)$/\1$new_name\2$new_address\3$new_phone\4/" in-file
Таким образом мы получающий разделителей полей (это в этом холоде случая вкладки и/или пробелы) и вывод их в их месте в замещающей строке.
Если мы не должны быть настолько точными, мы можем использовать что-то более простое в качестве следования (где вместо получения группируется, наш regex будет ожидать 0 или больше *
символы любого типа .
):
sed -r "s/^.*$old_name.*$old_address.*$old_phone.*$/$new_name\t$new_address\t$new_phone/" in-file
Или еще более простой:
sed -r "s/^.*$old_name.*$/$new_name\t$new_address\t$new_phone/" in-file
Пример:
$ cat in-file
Name. Address. Phone number
Jack. L.A. 1435672
John. L.A. 1465432
Nick. F.l. 1489756
$ old_name='Jack.' old_address='L.A.' old_phone='1435672' new_name='Tom.' new_address='F.l.' new_phone='875632'
$ sed -r "s/^(\t*|\s*)$old_name(\t*|\s*)$old_address(\t*|\s*)$old_phone(\t*|\s*)$/\1$new_name\2$new_address\3$new_phone\4/" in-file
Name. Address. Phone number
Tom. F.l. 875632
John. L.A. 1465432
Nick. F.l. 1489756