2014-11-29 5 views
0

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

Это содержимое моего файла 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

Что вы хотите сказать? –

+0

Команда sed написана как 'sed '/ x/d" 'not' sed/"x"/d'. Учитывая ваш опубликованный файл, что бы вы ожидали, если кто-то ввел «o»? Как насчет ".*"? Как насчет ":*"? Как насчет "/"? –

+0

Возможный дубликат [sed редактировать файл на месте] (http://stackoverflow.com/questions/12696125/sed-edit-the-file-in-place) –

ответ

1

Используйте -i вариант (--in-place) для редактирования файла в месте:

sed -i /"$delsmiley"/d smilies.txt 

-i вариант может использоваться с суффикс; исходный файл будет скопирован.

sed -i.bak /"$delsmiley"/d smilies.txt 

ОБНОВЛЕНИЕ

Как Ed Мортона, в течение некоторого ввода вышеуказанной команды вызовет ошибку. Чтобы избежать этого, вам нужно использовать другую команду, которая интерпретирует входную строку как есть. Например, используя grep -v с -F вариант:

grep -Fv "$delsmiley" smilies.txt > $$.tmp && mv $$.tmp smilies.txt 
2

Вы не можете использовать СЭД для этого, как СЕПГ работает только на регулярных выражениях и вам нужен файл, который будет рассматриваться в качестве полей строк или вы будете иметь неразрешимой (с 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.

Смежные вопросы