1

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

我的 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),我觉得参数存在某种语法错误。请输入任何内容

4

3 回答 3

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

如果你认为你可以逃避/s 并使用 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。

于 2013-09-27T12:54:51.920 回答
4

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

改变:

sed '/$myvar/d' data.txt

至:

sed "/$myvar/d" data.txt

注意:如Ed Morton 的回复中$myvar所指出的,当包含正则表达式元字符或正斜杠时,您会遇到问题。如果您不能完全控制您的输入,您将需要找到另一种途径来完成此操作。

于 2013-09-26T20:44:10.803 回答
1

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

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

-i除了@SeanBright 建议的内容之外,还可以使用选项。那你就不需要了> temp.txt and mv temp.txt data.txt

sed -i "/$myvar/d" data.txt
于 2013-09-26T20:50:40.657 回答