2013-09-26 124 views
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),我觉得有一些与论据的语法错误。任何输入请

+0

请参阅http://mywiki.wooledge.org/Quotes –

回答

4

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

变化:

sed '/$myvar/d' data.txt 

到:

sed "/$myvar/d" data.txt 

注:你会遇到的问题时,$myvar包含正则表达式元字符或正斜杠指出in this response from Ed Morton。如果你不完全控制你的输入,你将需要找到另一条途径来完成这个任务。

+0

唉,谢谢! :) – Nicktard

+0

当myvar包含一个'/'或其他几个字符中的一个时,试一下这个命令会产生意想不到的结果和/或错误信息。 –

+0

这只是改变了这个问题。当'$ 1'包含'\ /'时立即尝试。这是sed语法的一个基本问题,你不能通过计算出哪些字符可以逃脱来解决它,因为这会产生其他问题。sed只是不适合这类问题的正确工具。 –

1

你也可以用awk做同样的,

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

使用-i除了@SeanBright提出什么选项。那么你将不需要0​​。

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

我喜欢-i!多谢你们。 – Nicktard

+1

切勿使用这里发布的awk命令样式。它具有更多的问题,然后发布的sed命令为各种输入字符所做的事情,与sed不同,没有必要使用awk暴露自己的问题。 –

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在它的搜索中。

+0

不,它不是(尝试 - 你会看到),斜杠不是你需要担心的唯一字符,请参阅上面的其他几个问题。 –

+0

不,你不能逃避斜线。查看我刚刚在您的答案下发布的评论。我还更新了我的答案,以明确地说明原因。 –

+0

不,这不起作用,因为如果你正在寻找包含'6'的行,它会删除包含'64'的行。我不是简单地争论语义,这是其中有许多建议的解决方案看起来是正确的,并在发布的示例数据上工作的问题之一,然后一年后,“解决方案”将您的整个文件或目录抹去,而您知道为什么。 –