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
应该能够在一个范围内实现这一点。