Regex 在文件之间搜索和替换

Regex 在文件之间搜索和替换,regex,shell,grep,text-processing,Regex,Shell,Grep,Text Processing,有两个文件:file1和file2 文件1末尾的内容: support: -hjk -jhj name: akklk jhlkjj pklkkl 在file2中,这些内容存在于某个地方 在文件2中: support: kdfdgfg dfgfg gfkll;';' #jdddddfbgbgbbbbbbbbbb fklfdfklkl; name: -efffffffff -ccccc -effff #bbknlvkmlkjml 我需要复制从支持:开始的行,直到它

有两个文件:
file1
file2

文件1
末尾的内容:

support:
 -hjk
 -jhj

name:
 akklk
 jhlkjj
 pklkkl
file2
中,这些内容存在于某个地方

在文件2中:

support:
 kdfdgfg
 dfgfg
 gfkll;';'

#jdddddfbgbgbbbbbbbbbb

fklfdfklkl;

name:
 -efffffffff
 -ccccc
 -effff

#bbknlvkmlkjml
我需要复制从
支持:
开始的行,直到它找到一个以
开头的行,还需要复制从
名称:
开始的行,直到它在
文件2
中找到一个以
开头的行,并将其追加到
文件1
的末尾。
如何使用
grep
grep
模式从
file2
提取零件并将其附加到
file1

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

  • -P
    :使用perl正则表达式
  • -z
    :用
    \n
  • -o
    :仅打印匹配的行
  • ^(支持:|名称:)
    :搜索以
    支持:
    名称:
  • (((?!^#))*\n)*
    :然后是一个与以
    (?!^#)
    开头的行不匹配的模式,它是负数:
    (?!^#)
    。这之后是任何字符(
    ),以及所有可能出现零次或多次(
    *
    )的字符,然后是换行符(
    \n
    )。再说一遍:所有这些都可能出现零次或多次(最后一次
    *
  • >file1
    >
    操作符将标准输出附加到
    file1

grep
模式从
file2
提取零件,并将其附加到
file1

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

  • -P
    :使用perl正则表达式
  • -z
    :用
    \n
  • -o
    :仅打印匹配的行
  • ^(支持:|名称:)
    :搜索以
    支持:
    名称:
  • (((?!^#))*\n)*
    :然后是一个与以
    (?!^#)
    开头的行不匹配的模式,它是负数:
    (?!^#)
    。这之后是任何字符(
    ),以及所有可能出现零次或多次(
    *
    )的字符,然后是换行符(
    \n
    )。再说一遍:所有这些都可能出现零次或多次(最后一次
    *
  • >file1
    >
    操作符将标准输出附加到
    file1

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

或者,如果您不想在输出中包含终止线:

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

name:
 -efffffffff
 -ccccc
 -effff

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

或者,如果您不想在输出中包含终止线:

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

name:
 -efffffffff
 -ccccc
 -effff

最好显示更相关的输入,使其更清晰。目前它非常模糊
sed
应该能够在一个范围内实现这一点。最好显示更相关的输入,使其更清晰。目前它非常模糊
sed
应该能够在一个范围内实现这一点。最好显示更相关的输入,使其更清晰。目前它相当模糊
sed
应该能够在一个范围内实现这一点。