有两个文件:file1
和file2
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
?
答案 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