2014-09-04 43 views
-1

我有一個像我想用sed的

lg120:x:16003:16003:/home/lg120:/bin/bash 
lg121:x:16003:16003:/home/lg121:/bin/bash 
lg325:x:16002:16002:/home/lg325:/bin/bash 
lg356:x:16002:16002:/home/lg356:/bin/bash 
lg328:x:16003:16003:/home/lg328:/bin/bash 

我想用SED用戶lg325 /bin/bash更改爲/sbin/nologin要替換的文件在UNIX文件中的特定行。 我想這樣。

sed -i 's_/bin/bash_/sbin/nologin_' abc.txt 

但是它正在改變每一行。


我想通過參數script.it是腳本的一部分。$ 1我傳遞這是lg325

回答

1

你可以試試下面的sed命令,

$ sed '/^lg325/s~/bin/bash~/sbin/nologin~' file 

OR

$ sed '/^lg325:/s/\/bin\/bash/\/sbin\/nologin/' file 
lg120:x:16003:16003:/home/lg120:/bin/bash 
lg121:x:16003:16003:/home/lg121:/bin/bash 
lg325:x:16002:16002:/home/lg325:/sbin/nologin 
lg356:x:16002:16002:/home/lg356:/bin/bash 
lg328:x:16003:16003:/home/lg328:/bin/bash 

你的命令將所有/bin/bash字符串更改爲/sbin/nologin。您需要定義一個模式,以使sed在與相應模式匹配的特定行上執行替換。

+2

SED支持分離器行吟詩人而不是'''cmd中的'/'。在這種情況下可以節省很多逃避的工作。例如。在OP的代碼中,他使用'_' – Kent 2014-09-04 10:11:14

+0

是的,我同意... – 2014-09-04 10:12:06

2

使用一種模式來限制地址空間爲僅要行以替代適用於:

$ sed '/^lg325:/s_/bin/bash_/sbin/nologin_' file 
lg120:x:16003:16003:/home/lg120:/bin/bash 
lg121:x:16003:16003:/home/lg121:/bin/bash 
lg325:x:16002:16002:/home/lg325:/sbin/nologin 
lg356:x:16002:16002:/home/lg356:/bin/bash 
lg328:x:16003:16003:/home/lg328:/bin/bash 
0

您可以使用awk

awk '/^lg325/ {sub(/\/bin\/bash/,"/sbin/nologin")}1' file 
lg120:x:16003:16003:/home/lg120:/bin/bash 
lg121:x:16003:16003:/home/lg121:/bin/bash 
lg325:x:16002:16002:/home/lg325:/sbin/nologin 
lg356:x:16002:16002:/home/lg356:/bin/bash 
lg328:x:16003:16003:/home/lg328:/bin/bash 

要寫入到文件

awk '/^lg325/ {sub(/\/bin\/bash/,"/sbin/nologin")}1' file > tmp && mv tmp file 

或者作爲Jidder寫道,只需更換申請數量6

awk -F: '/^lg325:/{$6="/sbin/nologin"}1' OFS=: file 
+0

另一種方式'awk -F:'/^lg325:/ {$ 6 =「/ sbin/nologin」} 1'OFS =:' – 2014-09-04 10:50:28