sed替换特定行号的内联特定列号值

use*_*728 4 linux shell sed

我有一个5列csv文件(空格分隔),如下所示:

username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled 20130310 disabled
Run Code Online (Sandbox Code Playgroud)

我试图改变第四列的值username4.

我的脚本已经获取行号和要存储的新值username4:所以我想将第4列值替换$newValue为行号$lineNumber.

在我的样本中:

newValue=anything
lineNumber=4
Run Code Online (Sandbox Code Playgroud)

这样它将呈现:

username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled anything disabled
Run Code Online (Sandbox Code Playgroud)

我计划使用sed而不是awk因为sed我们可以用线进行更改-i

Chr*_*our 14

这是一种方式:

$ 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
Run Code Online (Sandbox Code Playgroud)

但避免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
Run Code Online (Sandbox Code Playgroud)

有了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
Run Code Online (Sandbox Code Playgroud)