【问题标题】:How to insert a constant string into a text file in every line after N characters in bash如何在bash中N个字符后的每一行中将常量字符串插入文本文件
【发布时间】:2017-04-17 10:38:58
【问题描述】:

我需要一个 bash 或 awk 或 sed 解决方案,以便在文件的每一行中插入一个字符串,在 N 个空格之后

例如我想要这个文件

Nov 30 23:09:39.029313 sad asdadfahfgh
Nov 30 23:09:39.029338 ads dsfgdsfgdf
Nov 30 23:09:46.246912 hfg sdasdsa
Nov 30 23:09:46.246951 jghjgh dfgdfgdf

成为

Nov 30 23:09:39.029313 my_constant_string sad asdadfahfgh
Nov 30 23:09:39.029338 my_constant_string ads dsfgdsfgdf
Nov 30 23:09:46.246912 my_constant_string hfg sdasdsa
Nov 30 23:09:46.246951 my_constant_string jghjgh dfgdfgdf

我尝试了以下方法但不起作用:

awk '{print $2" "$3" "$4" crit { for(i=5;i<NF;i++) print $i}}' log_file

【问题讨论】:

  • 发布你的尝试
  • 我试过 cat log_file | awk '{print $2" "$3" "$4" crit { for(i=5;i

标签: bash file awk sed


【解决方案1】:

使用 GNU sed

$ sed 's/ / xxx /3' file

Nov 30 23:09:39.029313 xxx sad asdadfahfgh
Nov 30 23:09:39.029338 xxx ads dsfgdsfgdf
Nov 30 23:09:46.246912 xxx hfg sdasdsa
Nov 30 23:09:46.246951 xxx jghjgh dfgdfgdf

【讨论】:

  • 这很聪明!你可以说 sed 's/./&amp;HELLO/23' file 就可以了,因为它会在第 23 个字符之后附加“HELLO”。
【解决方案2】:

你可以用这个;

awk '{$4="my_constant_string "$4; print $0}' yourFile

awk '{for (i=1;i<=3;i++) printf "%s ", $i ;printf "my_constant_string " ; for (i=4;i<=NF;i++) printf "%s ", $i; printf "\n" }'

测试

$ awk '$4="my_constant_string " $4' test
Nov 30 23:09:39.029313 my_constant_string sad asdadfahfgh
Nov 30 23:09:39.029338 my_constant_string ads dsfgdsfgdf
Nov 30 23:09:46.246912 my_constant_string hfg sdasdsa
Nov 30 23:09:46.246951 my_constant_string jghjgh dfgdfgdf

【讨论】:

  • awk '$4="my_constant_string " $4' file
  • 不,您不需要更新,您的原始答案很容易理解。我发表的评论是一个技巧。此外,如果 OP 想要添加一个字符串 "0" ,那么它可能会失败。所以你的很好。
【解决方案3】:

如果要在固定字符数之后添加内容,而不是在特定列上,请使用sed

sed -r 's/^.{23}/&HELLO /' file

sed 's/^.\{23\}/&HELLO /' file  # equivalent, without -r

这会捕获该行的前 23 个字符并将它们打印回来。

这会返回:

Nov 30 23:09:39.029313 HELLO sad asdadfahfgh
Nov 30 23:09:39.029338 HELLO ads dsfgdsfgdf
Nov 30 23:09:46.246912 HELLO hfg sdasdsa
Nov 30 23:09:46.246951 HELLO jghjgh dfgdfgdf

【讨论】:

    【解决方案4】:

    在与 sed 一致的最后一位数字之后插入您的字符串:

    $ sed 's/.*[0-9]/& my_constant_string/' file
    

    【讨论】:

      【解决方案5】:

      使用 Gnu awk 你可以:

      $ awk 'sub(/^.{22}/,  "& my_constant_string")' file
      Nov 30 23:09:39.029313 my_constant_string sad asdadfahfgh
      Nov 30 23:09:39.029338 my_constant_string ads dsfgdsfgdf
      Nov 30 23:09:46.246912 my_constant_string hfg sdasdsa
      Nov 30 23:09:46.246951 my_constant_string jghjgh dfgdfgdf
      

      由于正则表达式 .{22} 仅适用于 Gnu awk 和其他版本,因此应该:

      $ awk 'sub(/^....................../,  "& my_constant_string")' file
      

      【讨论】:

        【解决方案6】:
        awk '{print $1,$2,$3,"my_constant_string",$4,$5}' file
        
        Nov 30 23:09:39.029313 my_constant_string sad asdadfahfgh
        Nov 30 23:09:39.029338 my_constant_string ads dsfgdsfgdf
        Nov 30 23:09:46.246912 my_constant_string hfg sdasdsa
        Nov 30 23:09:46.246951 my_constant_string jghjgh dfgdfgdf
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-13
          • 1970-01-01
          • 2020-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多