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

Это содержимое моего файла 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
0
Rosen Stratkov 29 Ноя 2014 в 04:55
Какой у Вас вопрос?
 – 
Drazzah
29 Ноя 2014 в 05:07
Команды sed записываются как sed "/x/d", а не sed /"x"/d. Учитывая ваш опубликованный файл, что вы ожидаете, если кто-то введет «o»? Что о ".*"? Что о ":*"? Что о "/"?
 – 
Ed Morton
29 Ноя 2014 в 09:08
Возможный дубликат sed отредактируйте файл на месте
 – 
Benjamin W.
7 Мар 2016 в 01:42

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.

2
Ed Morton 29 Ноя 2014 в 09:24

Используйте параметр -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
1
falsetru 29 Ноя 2014 в 09:36