bash - 将数据从一个来源迁移到另一个来源的脚本

标签 bash perl sed scripting

我有一个 .h 文件,其中包含这种格式的数据

struct X[]{
{"Field", "value1 value2 value"},
{"Field2", "value11 value12 value232"},
{"Field3", "x  y z"},
{"Field4", "a bbb s"},
{"Field5", "sfsd sdfdsf sdfs"};
/****************/
};

我有一个包含我想用新值替换 .h 文件中的值的文本文件

value1   Valuesdfdsf1  
value2   Value1dfsdf  
value3   Value1_another  
sfsd     sfsd_ewew   
sdfdsf   sdfdsf_ew 
sdfs     sfsd_new   

生成的 .h 文件将包含上述文本文件的替换内容。其他一切都保持不变。

struct X[]{
    {"Field1", "value11 value12 value232"},
    {"Field2", "value11 value12 value232"},
    {"Field3", "x  y z"},
    {"Field4", "a bbb s"},
    {"Field5", "sfsd_ewew sdfdsf_ew sdfs_new"};
    /****************/
    };

请帮助我提出一个使用 unix 工具完成它的解决方案:awk、perl、bash、sed 等

最佳答案

cat junk/n2.txt | perl -e '{use File::Slurp; my @r = File::Slurp::read_file("junk/n.txt"); my %r = map {chomp; (split(/\s+/,$_))[0,1]} @r; while (<>) { unless (/^\s*{"/) {print $_; next;}; my ($pre,$values,$post) = ($_ =~ /^(\s*{"[^"]+", ")([^"]+)(".*)$/); my @new_values = map { exists $r{$_} ? $r{$_}:$_ } split(/\s+/,$values); print $pre . join(" ",@new_values) . $post . "\n"; }}'     

结果:

struct X[]{
{"Field", "value1 Value1dfsdf value"},
{"Field2", "value11 value12 value232"},
{"Field3", "x y z"},
{"Field4", "a bbb s"},
{"Field5", "sfsd_ewew sdfdsf_ew sfsd_new"};
/****************/
};

解开代码:

use File::Slurp;
my @replacements = File::Slurp::read_file("junk/n.txt"); 
my %r = map {chomp; (split(/\s+/,$_))[0,1]} @replacements; 
while (<>) {
    unless (/^\s*{"/) {print $_; next;}
    my ($pre,$values,$post) = ($_ =~ /^(\s*{"[^"]+", ")([^"]+)(".*)$/); 
    my @new_values = map { exists $r{$_} ? $r{$_} : $_ } split(/\s+/, $values);
    print $pre . join(" ",@new_values) . $post . "\n";
}

关于bash - 将数据从一个来源迁移到另一个来源的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4271313/

相关文章:

arrays - 将字符串(基于逗号)拆分为数组,在列表末尾添加一个空项

string - 在我当前目录下的所有文件中用另一个字符串替换一个字符串

linux - linux中如何退出select

linux - 同时启动多个程序

linux - 使用 sed 命令替换文件中的行

javascript - 使用 CMD 或 JavaScript 批量查找和删除部分 HTML 文件

linux - 以下 "top"命令: top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//' `的语法简单解释是什么

bash - bash 脚本中的 while 循环在 vim 中没有正确突出显示

xml - 无法使用 XML 架构和 Perl (XML::LibXML) 验证 XML

javascript - 在浏览器中捕获由我的脚本创建的特定 cookie