使用sed命令删除shell脚本文件中的行

时间:2014-11-29 01:55:31

标签: shell unix sed text-files

我试图通过输入的某个关键字删除文件中的一行。然后自动显示整个文件内容,而不输入单词(成功)。但是,文件本身仍包含应该删除的单词。

这是我的文件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 个答案:

答案 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