Найдите и удалите строку, которая запускается с определенной строки в файле

Мой файл в настоящее время имеет

Name.      Address.   Phone number 
Jack.        L.A             1435672
John         L.A.            1465432
Nick.        F.l.            1489756

Когда пользователь хочет удалить контакт из списка, он вводит имя контакта, и программа удаляет целую строку. Когда пользователь хочет изменить контакт, он вводит имя, и найдите контакт и затем измените его с новым именем, адресом и номером телефона. Я пытаюсь достигнуть этого использования двух функций, удаляют и изменяют.

2
задан 26 January 2019 в 16:08

1 ответ

Можно использовать команду 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
2
ответ дан 2 December 2019 в 03:29

Другие вопросы по тегам:

Похожие вопросы: