我有两个文本文件。使用 sed 或 grep,如何找到匹配的字符串,然后替换 text2.txt 中的字符串?
它应该搜索 name=" " 下的任何内容。如果找到,请将其替换为路径=“”下的内容。 output.txt 具有所需的输出数据。
测试1.txt
domain merge_requests
abc frameworks merge_requests
dvc frame-test merge_requests
测试2.txt
<project path="test/domain" name="device/common" />
<project path="test1/frameworks " name="test/frameworks" />
<name="test/frame-test" project path="test3/frame-test" />
输出.txt
test/domain merge_requests
test1/frameworks merge_requests
test/frame-test merge_requests
答案1
您的描述与您的示例有所不同。按照您的示例,您始终希望将/
第一个带引号的字符串后面的子字符串替换为整个第一个带引号的字符串,并删除前面的单词(如果存在)。
test2.txt
因此,您可以首先从保留缓冲区中收集第一个带引号的字符串,如下所示:
sed 's/[^"]*"\([^"]*\)".*/\1/;H;$!d;g' test2.txt
然后通过将其附加到每个保留来使用此集合进行替换:
sed '/<.*>/{s/[^"]*"\([^"]*\)".*/\1/;H;d};G;s/[^ ]* *\([^ ]\{1,\}\)\( [^\n]*\)\n.*\n\([a-z0-9]*\/\)\1.*/\3\1\2/;s/\n.*//' test2.txt test1.txt
最后的s
命令是处理不匹配的行;如果您的情况不会发生这种情况,您可以将其保留。这给出了你的输出。
如果您希望它更像您所描述的那样,您可以对其进行调整。但要注意name
和的顺序变化path
。