Bash удаление указанной строки c в файле .dat - PullRequest
0 голосов
/ 19 марта 2020

Итак, у меня есть это назначение, которое требует, чтобы я удалил определенную строку из файла .dat. Теперь мой файл в основном телефонная книга. У меня есть сценарий Bash, который добавляет идентификатор, имя, фамилию, номер телефона, адрес и т. Д. c. В файл .dat. Теперь один из флагов должен быть -delete и принимать параметр id. Итак, в основном мне нужно реализовать функцию, в которую я бы поместил ./phonebook.sh -delete -id 7, и она удалила бы строку, где идентификатор равен 7.

Я пытался использовать sed и awk, но ничего не работает и это расстраивает Мой текущий код для этого короткого сценария (delete.sh):

id=$1
sed "/$id/d" phonebook.dat

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Я делаю некоторые предположения, потому что я не знаю, каков формат вашего файла данных. Я предполагаю, что поле id является первым полем, а файл разделен запятыми. Если я ошибаюсь, вы можете изменить нижеприведенное, чтобы соответствовать вашим потребностям.

Лично мне нравится использовать grep -v для решения этой проблемы. При запуске --help:

-v, --invert-match        select non-matching lines

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

id="$1"
grep -v "^${id}," phonebook.dat > phonebook.temp
mv phonebook.temp phonebook.dat

Шаблон состоит из

  • ^: начало строки
  • ${id}: ваша переменная
  • ,: наш предполагаемый разделитель

причина указания начало строки до первого разделителя состоит в том, чтобы избежать удаления записей, где введенный идентификатор ($1) является подстрокой других идентификаторов. Вы не хотели бы вводить 22 и удалять идентификатор 22, а также идентификатор 122.

1 голос
/ 19 марта 2020

Попробуйте:

В Ма c:

sed -i '' -e "/$id/d" phonebook.dat

В противном случае:

sed -i -e "/$id/d" phonebook.dat

По умолчанию sed выводит результаты в стандартный вывод , Итак, ваша команда работала, но вывод не возвращался в файл. Флаг -i говорит о том, что файл должен быть заменен результатами. -i также предназначен для резервного копирования исходного файла. Например:

sed -i .bk -e "/$id/d" phonebook.dat

Выше будет создана копия оригинала с именем: phonebook.dat.bk. Однако, чтобы выполнить замену на месте без резервной копии, вы не можете указать значение -i. На MA C sed действительно очень хочет значение, поэтому вы можете передать ему пустую строку (убедившись, что между -i и пустыми кавычками есть пробел).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...