2014-11-20 305 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