SED在线的特定列号值在特定行号替换(sed replace in-line a specific

2019-08-17 20:44发布

我有一个5列csv文件(空格分隔)是这样的:

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

我'试图改变为第四列的值username4

我的剧本已经获得的行号,以及存储新值username4 :所以我想,以取代第4列值$newValue行号$lineNumber

在我的示例:

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

Answer 1:

这里有一种方法:

$ 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


Answer 2:

这可能会为你工作(GNU SED&Bash的):

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

不过要小心了。 如果newValue包含了/你需要替换命令分隔符更改到别的东西如s@\S\+@${newValue}@4



文章来源: sed replace in-line a specific column number value at a specific line number
标签: linux shell sed