Я пытаюсь удалить строку в файле по введенному ключевому слову. Затем все содержимое файла автоматически отображается без введенного слова (успех). Однако сам файл по-прежнему содержит слово, которое следовало удалить.
Это содержимое моего файла smilies.txt
:) smile
:( sad
;) wink
:D laughing
;( crying
:O surprise
:P tongue
:* kiss
:X nowords
:s confuse
Это мой сценарий:
echo 'Enter a smiley or its description you want to delete: '
read delsmiley
sed /"$delsmiley"/d smilies.txt
2 ответа
Вы не можете использовать sed для этого, так как sed работает ТОЛЬКО с регулярными выражениями, и вам нужно, чтобы ваш файл обрабатывался как поля строк, иначе у вас будут неразрешимые (с sed) проблемы с нежелательным поведением, учитывая различные пользовательские данные (например, попробуйте вашу команду sed с помощью delsmiley
установлен на /
, :*
и o
).
Вместо этого используйте awk:
awk -v d="$delsmiley" '($1 != d) && ($2 != d)' smilies.txt > tmp &&
mv tmp smilies.txt
В Gnu awk есть опция -i inplace
, которая позволяет вам не указывать явно имя файла tmp.
Используйте параметр -i
(--in-place
), чтобы отредактировать файл на месте:
sed -i /"$delsmiley"/d smilies.txt
Опция -i
может использоваться с суффиксом; исходный файл будет скопирован.
sed -i.bak /"$delsmiley"/d smilies.txt
ОБНОВЛЕНИЕ
Как и Эд Мортон, для некоторого ввода вышеприведенная команда вызовет ошибку. Чтобы избежать этого, вам нужно использовать другую команду, которая интерпретирует входную строку как есть. Например, используя grep -v
с опцией -F
:
grep -Fv "$delsmiley" smilies.txt > $$.tmp && mv $$.tmp smilies.txt
Похожие вопросы
Связанные вопросы
Новые вопросы
shell
Термин «оболочка» относится к общему классу интерпретаторов текстовых интерактивных команд, чаще всего связанных с операционными системами Unix и Linux. Для вопросов о сценариях оболочки используйте более конкретные теги, такие как «bash», «powershell» или «ksh». Без специального тега следует предполагать переносимое (совместимое с POSIX) решение, хотя использование «posix» в дополнение или «sh» вместо этого предпочтительнее.
sed "/x/d"
, а неsed /"x"/d
. Учитывая ваш опубликованный файл, что вы ожидаете, если кто-то введет «o»? Что о ".*"? Что о ":*"? Что о "/"?