【问题标题】:Searching and replacing between files在文件之间搜索和替换
【发布时间】:2015-08-20 03:07:27
【问题描述】:

有两个文件:file1file2

file1末尾的内容:

support:
 -hjk
 -jhj

name:
 akklk
 jhlkjj
 pklkkl

file2 中,这些内容存在于某处。

在文件 2 中:

support:
 kdfdgfg
 dfgfg
 gfkll;';'

#jdddddfbgbgbbbbbbbbbb

fklfdfklkl;

name:
 -efffffffff
 -ccccc
 -effff

#bbknlvkmlkjml

我需要复制从support: 开始的行,直到找到以# 开头的行,并复制从name: 开始的行,直到在file2 中找到以# 开头的行并追加它在file1 的末尾。 grep怎么办?

【问题讨论】:

  • 更好地显示更多相关输入以使其更清晰。目前它很模糊
  • sed 应该可以在范围内做到这一点。

标签: regex shell grep text-processing


【解决方案1】:

grep 模式从file2 中提取部分并将其附加到file1

grep -Pzo '^(support:|name:)(((?!^#).)*\n)*' file2 >>file1

解释正则表达式:

  • -P: 使用 perl 正则表达式
  • -z: 用\n 换行
  • -o: 只打印匹配的行
  • ^(support:|name:):搜索以support:name: 开头的行
  • (((?!^#).)*\n)*:然后是一个不匹配以#开头的行的模式,它是一个否定的lookaround(?!^#)。后面是任何字符 (.),以及所有可以出现零次或多次的字符 (*),然后是换行符 (\n)。再说一遍:所有可能出现零次或多次(最后一个*)。
  • >>file1>> 运算符将标准输出附加到 file1

【讨论】:

    【解决方案2】:

    grep 是错误的工具,你应该使用 awk。 grep 是用来做g/re/p 的,仅此而已(它的名字有一个很大的线索!)。

    $ awk '/(support|name):/{f=1} f; /^#/{f=0}' file2
    support:
     kdfdgfg
     dfgfg
     gfkll;';'
    
    #jdddddfbgbgbbbbbbbbbb
    name:
     -efffffffff
     -ccccc
     -effff
    
    #bbknlvkmlkjml
    

    或者如果您不希望在输出中包含终止行:

    $ awk '/(support|name):/{f=1} /^#/{f=0} f' file2
    support:
     kdfdgfg
     dfgfg
     gfkll;';'
    
    name:
     -efffffffff
     -ccccc
     -effff
    

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 2015-09-04
      • 1970-01-01
      • 2014-11-28
      • 2022-01-07
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多