Python实现用另一文件内容替换指定文件中含msgstr的行
用f1.txt内容替换f2.po中指定行的解决方案
方法一:使用awk命令(推荐,适合快速处理)
直接在终端执行以下命令,会生成处理后的新文件new_f2.po:
awk 'NR==FNR {lines[++n]=$0; next} /msgstr/ {$0=lines[++cnt]} 1' f1.txt f2.po > new_f2.po
命令解释:
NR==FNR:仅在读取第一个文件(f1.txt)时执行,将每一行存入数组lines,n记录f1的总行数。next:跳过当前行的后续处理,直接读取下一行。/msgstr/:读取第二个文件(f2.po)时,匹配包含"msgstr"的行,将其替换为lines数组中第cnt行,cnt是替换次数计数器。1:默认打印每一行(处理后的内容)。- 输出重定向到
new_f2.po,避免直接修改原文件导致数据丢失。
补充:处理f1行数不足的情况
如果f1.txt的行数少于f2.po中"msgstr"行的数量,多出来的"msgstr"行会被替换为空行。若想保留这些行的原内容,可修改命令为:
awk 'NR==FNR {lines[++n]=$0; next} /msgstr/ {if (cnt < n) $0=lines[++cnt]} 1' f1.txt f2.po > new_f2.po
方法二:使用Python脚本(适合自定义逻辑)
如果需要更灵活的处理逻辑,可使用以下Python脚本:
# 读取f1.txt的所有行,去除换行符 with open('f1.txt', 'r', encoding='utf-8') as f1: f1_lines = [line.rstrip('\n') for line in f1] replace_count = 0 # 生成处理后的文件 with open('f2.po', 'r', encoding='utf-8') as f2, open('new_f2.po', 'w', encoding='utf-8') as new_f2: for line in f2: if 'msgstr' in line: if replace_count < len(f1_lines): # 替换为f1对应行 new_line = f1_lines[replace_count] + '\n' replace_count += 1 else: # f1行不足时保留原行 new_line = line new_f2.write(new_line) else: new_f2.write(line)
脚本说明:
- 先读取f1.txt的所有内容到列表
f1_lines。 - 遍历f2.po的每一行,遇到含"msgstr"的行时,用
f1_lines中对应索引的内容替换,替换次数计数器自增。 - 当f1的行全部用完后,后续的"msgstr"行将保持原样。
- 处理结果写入
new_f2.po。
最终操作
检查new_f2.po内容无误后,可执行以下命令覆盖原文件:
mv new_f2.po f2.po
内容的提问来源于stack exchange,提问作者refik
相关产品推荐
相关产品推荐

