Удаление строк, содержащих переменную

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

Во-первых, я нашел, что мог сделать это с 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, действительно не имеет значения для меня.

4
задан 22 November 2016 в 13:52

2 ответа

Если Вы хотите использовать 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
5
ответ дан 1 December 2019 в 09:07

Фильтрация строк является основной ролью grep. Используйте -v переключатель для инвертирования соответствия, т.е. только показа строк, который не содержит текст. Таким образом, можно использовать следующую команду:

read deletename; grep -v $deletename test.txt
3
ответ дан 1 December 2019 в 09:07

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

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