【问题标题】:sed replace in-line a specific column number value at a specific line numbersed 在特定行号替换特定列号值
【发布时间】:2013-03-22 19:36:51
【问题描述】:

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

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

我正在尝试更改 username4 的第 4 列的值。

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

在我的示例中:

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 进行内联更改

【问题讨论】:

  • 你已经尝试了什么?

标签: linux shell sed


【解决方案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

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed 和 Bash):

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

    但是要小心。如果 newValue 包含 / 您将需要将替换命令分隔符更改为其他内容,例如s@\S\+@${newValue}@4

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2012-04-07
      • 2021-04-26
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2013-06-06
      相关资源
      最近更新 更多