搜索和替换文件

时间:2015-06-05 08:32:10

标签: regex shell grep text-processing

有两个文件:file1file2

file1末尾的内容:

support:
 -hjk
 -jhj

name:
 akklk
 jhlkjj
 pklkkl

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

在file2中:

support:
 kdfdgfg
 dfgfg
 gfkll;';'

#jdddddfbgbgbbbbbbbbbb

fklfdfklkl;

name:
 -efffffffff
 -ccccc
 -effff

#bbknlvkmlkjml

我需要复制从support:开始的行,直到找到以#开头的行,并复制从name:开始的行,直到找到以{{1}开头的行在#中将其附加到file2的末尾。 如何使用file1

2 个答案:

答案 0 :(得分:0)

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

grep -Pzo '^(support:|name:)(((?!^#).)*\n)*' file2 >>file1
正则表达式的

解释

  • -P:使用perl正则表达式
  • -z:使用\n
  • 进行换行
  • -o:仅打印匹配的行
  • ^(support:|name:):搜索以support:name:
  • 开头的行
  • (((?!^#).)*\n)*:然后是一个与以#开头的行不匹配的模式,它是否为lookaround(?!^#)。接下来是任何字符(.),所有字符都可以显示为零次或多次(*),后面再跟一个换行符(\n)。而且:所有这些都可以出现零次或多次(最后*)。
  • >>file1>>运算符将标准输出附加到file1

答案 1 :(得分:0)

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