截断以特定字符串开头的行

时间:2017-09-06 13:20:38

标签: bash sed

在日志文件中,我想截断所有以模式开头的行" IMPRESSION DE LA TABLE"到40个字符。我怎么能这样做?

例如,如果file.log包含以下行:

  IMPRESSION DE LA TABLE A.B.C          12345
                                       ^ 40th character

然后我想保留:

  IMPRESSION DE LA TABLE A.B.C          

我绝对需要保留表格的名称(在我的例子中为A.B.C)。

使用sed我可以删除模式后面的内容,但我不能保留其他字符:

sed 's/  IMPRESSION DE LA TABLE.*/  IMPRESSION DE LA TABLE/g' file.log

2 个答案:

答案 0 :(得分:3)

使用GNU sed,使用反向引用:

sed '/^\s*IMPRESSION DE LA TABLE/s/^\(.\{40\}\).*/\1/' file
  • /^\s*IMPRESSION DE LA TABLE/:当行以零或更多空格开头,后跟IMPRESSION DE LA TABLE
  • s/^\(.\{40\}\).*/\1/:捕获40个第一个字符,并使用\1输出。

答案 1 :(得分:0)

只需使用awk:

$ awk '/  IMPRESSION DE LA TABLE/{print substr($0,1,40)}' file
  IMPRESSION DE LA TABLE A.B.C

这适用于任何UNIX系统上任何shell中的任何awk,如果你的文本可以包含regexp元字符,那么很容易调整它来使用字符串函数而不是regexp:

$ awk 'index($0,"  IMPRESSION DE LA TABLE")==1{print substr($0,1,40)}' file
  IMPRESSION DE LA TABLE A.B.C