从两个唯一标签或评论之间的文件中提取内容并将其放入具有相同标签或评论的其他文件中?

Posted

技术标签:

【中文标题】从两个唯一标签或评论之间的文件中提取内容并将其放入具有相同标签或评论的其他文件中?【英文标题】:Extract the content from a file between two unique tags or comments and put it into other file with same tags or comments? 【发布时间】:2021-08-31 22:52:17 【问题描述】:

我有 2 个文件 test1.pytest2.py 包含此内容

test1.py:

#first

#endoffirst

#second

#endofsecond

#3rd

#endof3rd

test2.py :

#first
this is first command
#endoffirst

#second
this is second command
#endofsecond

#3rd
this is 3rd command
#endof3rd

我想先检查 test2.py 文件并在 #first#endoffirst 之间复制内容并将其放入相同的标签中test1.py 文件,包含 Linux 中的 bash 脚本或其他操作。我的意思是一个文件中两个唯一标签或命令之间的所有内容都应该复制并放在另一个文件中的相同标签或 cmets 之间。

我已经通过 sed 命令测试了很多东西,但我无法得到正确的答案。

感谢任何人都可以帮助我解决这个问题

【问题讨论】:

如果你想在bash...1): uniq 标签列表中这样做,我认为你必须 think associative array2):标签内容,3):标签顺序,4):通过file1中的标签重新创建file1。 这看起来像一个家庭作业?! @F.Hauri 不,我必须在 GitLab 中编写一些代码 sn-ps 并且需要合并具有相同名称的文件,但我需要将新的代码放在文件中的唯一位置。例如,在本地文件中,我有 setting.py,但是当我获取新设置时,我需要替换本地文件中的一些新代码 你说:``我已经测试了很多东西..'',请分享! @F.Hauri 我尝试使用 sed 和 diff 命令。首先,我使用 diff 命令比较两个文件,然后新文件包含第二个文件中的所有新内容,然后我尝试使用 sed 删除标签之间的额外内容,例如 sed "/#first/,/endoffirst/d" setting.py >newsetting.py && mv newsetting.py setting.py ,但这样做后我遇到了一些未知错误。 【参考方案1】:

如果你只想使用sed,我会分两次完成。

sed -n '/#first/,/#endoffirst/w tmp' test2.py
sed '/#first/,/#endoffirst/
       /#endoffirst/!d;
       /#endoffirst/ z; r tmp
      ' test1.py

#first
this is first command
#endoffirst

#second

#endofsecond

#3rd

#endof3rd

奇怪的格式是因为如果您使用r(或w),那么文件名必须是该行其余部分的唯一内容。 sed 将在文件名中包含分号、空格、右花括号或除换行符之外的几乎任何其他内容。

我可能会使用awk。这是一个笨拙的通行证。

$: awk '/#first/,/#endoffirst/
         if (NR == FNR)  x=x$0; if ($0 ~ "#endoffirst")  nextfile  else  x=x"\n"  
         else                   if ($0 ~ "#endoffirst")  print x;  
         next  print' test2.py test1.py
#first
this is first command
#endoffirst

#second

#endofsecond

#3rd

#endof3rd

【讨论】:

【参考方案2】:

这可能是你想要做的:

$ cat tst.awk
/^#/ 
    inBlock = !inBlock
    if ( inBlock ) 
        tag = $0
    

NR == FNR 
    if ( inBlock ) 
        val[tag] = (tag in val ? val[tag] ORS : "") $0
    
    next

$0 in val 
    print val[$0]

!inBlock

$ awk -f tst.awk test2.py test1.py
#first
this is first command
#endoffirst

#second
this is second command
#endofsecond

#3rd
this is 3rd command
#endof3rd

【讨论】:

【参考方案3】:
from os import fdopen, remove
from tempfile import mkstemp
from shutil import copymode, move

try:
    start_flag_count = end_flag_count = 0
    content_dict = 
    with open('/tmp/test2.py') as old_file:
        for line in old_file:
            ori_line = line
            line = line.strip()
            if line and line.startswith('#'):    # change '#' for your tags startswith
                if start_flag_count == end_flag_count:
                    cur_tag = line
                    start_flag_count += 1
                    mul_content_lines = ''
                elif start_flag_count == end_flag_count + 1:
                    content_dict[cur_tag] = mul_content_lines
                    end_flag_count += 1
            else:
                if start_flag_count == end_flag_count + 1:
                    mul_content_lines += ori_line

    ori_file = '/tmp/test1.py'
    fd, tmp_file_path = mkstemp()
    with fdopen(fd, 'w') as new_file:
        with open(ori_file) as old_file:
            for line in old_file:
                new_file.write(line)
                line = line.strip()
                if line and line.startswith('#') and line in content_dict:
                    new_file.write(content_dict[line])
    copymode(ori_file, tmp_file_path)
    remove(ori_file)
    move(tmp_file_path, ori_file)
except Exception as e:
    print str(e)

Python 2.7中运行,首先通过读取test2.py获取唯一标签内容并保存到带有开始标志的字典中;然后扫描 test1.py 并在开始标志行后面添加内容。

【讨论】:

以上是关于从两个唯一标签或评论之间的文件中提取内容并将其放入具有相同标签或评论的其他文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从文件中提取String和Int,并将其放入2D Array中。

如何从 NSDictionary 中提取一个整数并将其放入一个整数中?

如何从记事本文件中取出数据并将其放入用户定义的函数中?

powershell Powershell脚本,用于从CSV中提取数据并将其放入SharePoint列表中。

Jquery - 在mysql中查找两个唯一ID之间的范围

提取两个不同标签之间的文本 美丽的汤