这是一种方式:
$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
但是因为sed具有-i选项而避免使用awk并不是一个好理由. 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