2014-11-20 273 views
0

我想在bash脚本中执行此命令。在bash脚本中执行sed命令

代码:

#!/bin/bash 
line=39; 
d=d; ## For delete line 
`echo "sed '$line$d' /etc/passwd"`; 

但是,当我执行,我得到这个错误:

sed: -e expresion #1, character 1: unknow command <<'>> 

我试着用echo "sed \'$line$d\' /etc/passwd";

但同样的问题...

回答

1

您需要调用你的变量,你不要single-quoting防止扩大他们的时候,以确保。现在可以使用single-quotes范围内的double-quotes,但请注意。另外,虽然不是必需的,但当将两个变量背靠背放置时,最好使用花括号来确保不歧义。这就是说,你sed从脚本命令正常工作为:

sed -e "${line}${d}" /etc/passwd 

将输出/etc/passwdstdout减线$line。要就地编辑/etc/passwd,使用sed -i

+0

我不认为'D'应该扩大,他希望使用'sed'我相信删除。现在甚至没有“sed”命令......在我看来,问题在于他试图用一美元来结束变量,而不是用大括号封装变量。 – ShellFish 2014-11-20 23:42:51

+0

在调用''d = d'之前立即查看'pastebin'中的代码 – 2014-11-20 23:44:15

+0

是的,我忽略了那部分,我的不好。这绝对是更好的答案:) – ShellFish 2014-11-20 23:53:10

1

要删除第39行简单地做:

#!/bin/bash 
line=39; 
sed -i "${line}d" /etc/passwd 

桑达将采取第二个参数为输入文件和第一次一样的命令。额外的标志-i将允许您立即将输出重定向到输入文件。请注意,这与sed 'command' file > file不一样,因为这会导致一个空文件。

我还建议在shell中执行man sed

+0

从哪里删除“第39行”?输出到'stdout'?或在'/ etc/passwd'中? – 2014-11-20 23:43:11

+0

'/ etc/passwd'是输入文件,在pastebin中检查他的代码。 – ShellFish 2014-11-20 23:45:19

+0

我做了,sed'foo'/etc/password只能在'cat/etc/passwd'上运行。你必须包含'-i'来代替'edit in place'。 – 2014-11-20 23:46:49

0
#!/bin/bash 

# delete line 39 by editing inline via sed; 
sed -i '39d' /etc/passwd 

保持简单,并添加评论,如果你想记住的sed行动

+0

问题是我不知道这一行,我得到一个for的行号计数,并比较名字。在这种情况下, – Guille 2014-11-21 09:12:26

+0

,@ShellFish回复没问题 – NeronLeVelu 2014-11-24 07:37:33