我试图通过输入的某个关键字删除文件中的一行。然后自动显示整个文件内容,而不输入单词(成功)。但是,文件本身仍包含应该删除的单词。
这是我的文件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 :(得分: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文件名。
答案 1 :(得分:1)
使用-i
(--in-place
)选项编辑文件:
sed -i /"$delsmiley"/d smilies.txt
-i
选项可以与后缀一起使用;原始文件将被备份。
sed -i.bak /"$delsmiley"/d smilies.txt
<强>更新强>
作为Ed Morton,对于某些输入上面的命令会导致错误。为了避免这种情况,您需要使用其他命令来解释输入字符串。例如,使用带有grep -v
选项的-F
:
grep -Fv "$delsmiley" smilies.txt > $$.tmp && mv $$.tmp smilies.txt