2013-03-21 48 views
3

代替我有5列csv文件(空格分隔)是這樣的:SED在線特定列號值在特定行號

username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled 20130310 disabled 

我'試圖改變第四值列爲username4

我的腳本已經獲得行號和存儲username4的新值:所以我想用行號$lineNumber$newValue代替列4的值。

在我的示例:

newValue=anything 
lineNumber=4 

,使其呈現:

username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

我打算使用sed,而不是awk因爲sed,我們可以在網上做-i

改變
+0

你已經試過了什麼? – 2013-03-28 01:32:52

回答

11

以下是單程:

$ sed '/^username4/{s/ [^ ]*/ anything/3}' file 
username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

# store changes back to the file 
$ sed -i '/^username4/{s/ [^ ]*/ anything/3}' file 

但是迴避awk因爲sed-i選項不是很好的理由。 awk更適合處理這類問題。

$ awk '$1=="username4"{$4="anything"}1' file 
username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

# store changes back to the file 
$ awk '$1=="username4"{$4="anything"}1' file > tmp && mv tmp file 

隨着awk您可以輕鬆地做實地對比和編輯,使用shell變量是不是一個噩夢引用和理解你只昨天寫劇本是不是和問題不像sed

$ linenumber=4 

$ newvalue=anything 

$ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file 
username1 20130310 enabled 20130310 enabled 
username2 20130310 enabled 20130321 disabled 
username3 20130320 disabled 20130321 enabled 
username4 20130310 disabled anything disabled 

$ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file > tmp && mv tmp file 
1

這可能會爲你工作(GNU sed的&擊):

lineNumber=4 newValue=xxxx sed -i ${lineNumber}'s/\S\+/'"${newValue}"'/4' file 

但是要小心了。如果newValue包含/,則需要將替換命令分隔符更改爲其他值。 [email protected]\S\[email protected]${newValue}@4

+0

這工作得很好! – user2196728 2013-03-29 11:29:53