我正在尝试根据传入的参数删除特定行。
我的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),我觉得这个参数有某种语法错误。请输入任何信息
答案 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