У меня есть текстовый файл, который содержит имена. Я хотел бы, чтобы моя программа смогла удалить имена, которым я говорю ее.
Во-первых, я нашел, что мог сделать это с sed
, но это просто не работает на меня.
deletename
моя переменная, которая будет содержать шаблон, который я хочу использовать для поиска, и test.txt
мой текстовый файл.
Я использую:
deletename=0; read deletename; sed...
Я попробовал:
sed "/$deletename/ d" test.txt
sed "/$deletename/d" test.txt
sed '/$deletename/ d' test.txt
sed '/$deletename/d' test.txt
sed -e "/$deletename/ d" test.txt
sed -e "/$deletename/d" test.txt
sed -e '/$deletename/ d' test.txt
sed -e '/$deletename/d' test.txt
sed -r "/$deletename/ d" test.txt
sed -r "/$deletename/d" test.txt
sed -r '/$deletename/ d' test.txt
sed -r '/$deletename/d' test.txt
Так как ни одно из этого не работало, у меня была идея, для проверки номера строки, который имеет шаблон, и удалите ту строку. Я знаю, что должен использовать grep
, но у меня нет абсолютно никакой идеи, как я должен использовать его.
Я попробовал что-то вроде этого, но это не работало:
lineno=`expr grep -n $deletename test.txt`
Кто-то смог бы помочь? С sed
или grep
, действительно не имеет значения для меня.
Если Вы хотите использовать read
для передачи имен, и Вы хотите удалить строки, которые содержат имена:
read deletename; sed "/$deletename/d" test.txt
затем нажмите Enter и read
ожидает Вас для ввода чего-то, так введите то, что Вы хотите deletename
быть, например 0
, затем нажмите Enter снова и sed
команда выполняется. Содержание test.txt
появится в терминале, но все строки, которые содержат 0
, или независимо от того, что Вы ввели, будет удален из потока (НЕ из файла)
Если Вы только хотите удалить сами имена, это похоже на это:
read deletename; sed "s/$deletename//g" test.txt
Если Вы затем вводите 0
, затем каждый экземпляр 0
будет удален.
Можно перенаправить (или tee
) вывод в новый файл, или если Вы хотите изменить файл на месте, использует -i
флаг (после тестирования)
read deletename; sed -i "/$deletename/d" test.txt
В этом случае Вы не будете видеть вывода; изменения будут записаны в файл вместо отображенного в терминале (на STDOUT).
Необходимо использовать двойные кавычки для разрешения расширения параметра, поскольку одинарные кавычки подавят его. но самый корректный путь, я думаю, хотя не необходимый в этом простом случае, это, чтобы использовать одинарные кавычки вокруг других частей выражения и обычно заключать переменную в кавычки:
sed 's/'"$deletename"'//g' test.txt
Фильтрация строк является основной ролью grep
. Используйте -v
переключатель для инвертирования соответствия, т.е. только показа строк, который не содержит текст. Таким образом, можно использовать следующую команду:
read deletename; grep -v $deletename test.txt