【问题标题】:Bash - how to replace line specific field seperated by colon delimiter (:)?Bash - 如何替换由冒号分隔符 (:) 分隔的行特定字段?
【发布时间】:2014-08-29 06:32:12
【问题描述】:

我有一个 BookDB.txt 文件,它以以下格式存储数据:

Java for dummies:Pauline:10.56:4:3
Bash for dummies:David:10.45:4:5
PHP for dummies:Frederich:10.67:4:4
Perl for dummies:Pearlyn:10.56:4:5
C++ for dummies:Jared:10.46:4:5

如果我想说,将第四行的第一个字段替换为“anything for dummies”,这样文件看起来就像下面一样,我该怎么做?

Java for dummies:Pauline:10.56:4:3
Bash for dummies:David:10.45:4:5
PHP for dummies:Frederich:10.67:4:4
anything for dummies:Pearlyn:10.56:4:5
C++ for dummies:Jared:10.46:4:5

我已经尝试过其他人在这个问题中提供的 sn-ps,但是第一个字段中的空格给我带来了问题:

sed replace in-line a specific column number value at a specific line number

【问题讨论】:

    标签: arrays bash file awk sed


    【解决方案1】:

    如果你想在第 4 行替换:

    sed '4s/[^:]*:/anything for dummies:/' input
    

    如果您想要替换匹配“Perl for dummies”:

    sed '/^Perl/s//anything/' input
    

    【讨论】:

      【解决方案2】:

      如果您使用sed,您可能需要很好地引用您的表达式:

      sed 's|^Perl for dummies|anything for dummies|' your_file
      

      输出:

      Java for dummies:Pauline:10.56:4:3
      Bash for dummies:David:10.45:4:5
      PHP for dummies:Frederich:10.67:4:4
      anything for dummies:Pearlyn:10.56:4:5
      C++ for dummies:Jared:10.46:4:5
      

      在开头添加-i 选项会直接更改文件。

      如果您的 sed 支持它,我建议使用 -E-r,因为它更容易。在这里,您需要用 \'s 引用 ():

      sed -E 's|^Perl( for dummies)|anything\1|' your_file
      

      该命令给出相同的输出/结果。

      【讨论】:

      • 有趣...在这种情况下我将如何使用变量?类似于:sed 's|^${OLDTITLE}|${NEWTITLE}|'你的文件?
      • @JaredAaronLoo 你必须使用"" 而不是'' 例如sed "s|^${OLDTITLE}|${NEWTITLE}|" your_file。我只是希望你的标题不需要有可被 sed 识别为正则表达式的字符。如果他们这样做,这些字符也需要被引用。大多数时候它与\一起使用。如果不是[],例如[.].
      • 虽然它用anything for dummies 替换了Perl for dummies 文本,但它是否解决了替换第四行的第一个字段 的上述问题?如果Perl for dummies 文本也出现在文件的其他地方怎么办?
      • @anubhava 我实际上猜测他只是在描述一个关于 4the 行的例子。然而重点是“但第一个字段中的空格给我带来了问题”
      • 其实如果我想替换任何我想要的字段,anubhava的解决方案不是更好吗?只是无法弄清楚如何在他的解决方案中正确使用变量。类似于:awk -F: "NR==${LINENUMBER}{$1=${NEWTITLE}}1" OFS=: file ?
      【解决方案3】:

      使用awk,您可以使用字段分隔符: 并定位特定的行和列:

      awk -F: 'NR==4{$1="anything for dummies"}1' OFS=: file
      Java for dummies:Pauline:10.56:4:3
      Bash for dummies:David:10.45:4:5
      PHP for dummies:Frederich:10.67:4:4
      anything for dummies:Pearlyn:10.56:4:5
      C++ for dummies:Jared:10.46:4:5
      

      【讨论】:

      • 不是逗号,而是冒号...感谢您的努力!
      • 查看最新的编辑,它现在就在那里。我忘了使用OFS=:
      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多