删除包含在命令行上传递的参数的文件中的行

时间:2013-09-26 20:42:02

标签: database shell unix sed

我正在尝试根据传入的参数删除特定行。

我的data.txt文件包含

Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

我的del.sh包含

myvar=$1

sed'/$myvar/d' data.txt > temp.txt
mv temp.txt > data.txt

但它只是将temp.txt中的每一行打印到data.txt ....但是

sed '/64/d' data.txt > temp.txt

将进行正确的数据传输(但我不想硬编码64),我觉得这个参数有某种语法错误。请输入任何信息

3 个答案:

答案 0 :(得分:4)

这是因为单引号,将它们更改为双引号。单引号内的变量不会进行插值,因此您要将文字字符串 $myvar发送到sed,而不是的值 {{1} }。

变化:

$myvar

为:

sed '/$myvar/d' data.txt

注意:sed "/$myvar/d" data.txt 包含正则表达式元字符或正斜杠in this response from Ed Morton时,您将遇到问题。如果您无法完全控制自己的输入,则需要找到另一种途径来实现这一目标。

答案 1 :(得分:4)

假设这是不良行为:

$ cat file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

$ myvar=6
$ sed "/$myvar/d" file
Monitor 22 42 50

$ myvar=/
$ sed "/$myvar/d" file
sed: -e expression #1, char 3: unknown command: `/'

$ myvar=.
$ sed "/$myvar/d" file
$

请改为尝试:

$ myvar=6
$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Monitor 22 42 50
Game 32 64 128

$ myvar=/
$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

$ myvar=.
$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

如果您认为可以逃脱/并使用sed,则不能,因为您可能会向已经存在的第二个反斜杠添加第二个反斜杠:

$ foo='\/'
$ myvar=${foo//\//\\\/}
$ sed "/$myvar/d" file
sed: -e expression #1, char 5: unknown command: `/'

$ awk -v myvar="$myvar" '{for (i=1; i<=NF;i++) if ($i == myvar) next }1' file
Cpu 500 64 6
Monitor 22 42 50
Game 32 64 128

由于它的语法,这通常不是你一般可以用sed做的工作,并且限制只允许在其搜索中使用RE。

答案 2 :(得分:1)

你也可以用awk做同样的事,

awk '!/'$myvar'/' data.txt > temp.txt && mv temp.txt data.txt

除@SeanBright提议的内容外,还使用-i选项。那么您将不需要> temp.txt and mv temp.txt data.txt

sed -i "/$myvar/d" data.txt