【问题标题】:Searching and replacing between files在文件之间搜索和替换
【发布时间】:2015-08-20 03:07:27
【问题描述】:
有两个文件:file1 和 file2
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怎么办?
【问题讨论】:
标签:
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