情况:我有一个 HTML 源文件,其中一些值必须使用另一个文件中的数据来完成。
必须丰富的价值是在独特的标签之间。
<Uniquetag>Mystring1</uniquetag>
文件 2 有几列和许多行:
Info1 Mystring1 OtherInfo1 MoreInfo1
Info2 Mystring2 OtherInfo2 MoreInfo2
Info3 Mystring3 OtherInfo3 MoreInfo3
....
之后我想在 HTML 中出现我的事件:
<Uniquetag>Mystring1 - Info1</uniquetag>
file1 和 file2 都是动态的并且定期更改,我在每次更改后运行我的脚本。文件 1 可能不包含 Uniquetag,因此不应查找任何内容。也有可能在 file2 中找不到 MyString1。在这种情况下不应添加任何内容。
有人能指出我在这方面的正确方向吗?
答案1
使用“perl”
我将使用 Perl 脚本来完成此操作,如以下元代码所述:
for each line in file2:
read line
parse line into 4 fields with a pattern match
build an associative array with $array{field2} = "field2 - field1"
slurp file1 into a single variable f
for each pattern match of /<UniqueTag>(match)</UniqueTag>/ in f:
replace "match" with $array{match}
答案2
但是,如果您的 HTML 格式如您所显示的那样,那么这可能会完成工作:
expr=
while read -r one two rest
do
expr="$expr; s/<uniquetag>$two<\/uniquetag>/<uniquetag>$two - $one<\/uniquetag>/"
done < file2
sed "$expr" sourcehtml > targethtml
...如果您对结果感到满意,可以将表达式更改sed
为:
sed -i "$expr" sourcehtml
...让它就地编辑 sourcehtml 文件。
有很多方法可以打破这种情况,其中一些是:
- file2 的前两列中有一个正斜杠或单引号
- file2 中的行太多,导致 sed 表达式变得太大(通过多次调用 sed 解决)
- 标签的大写与“uniquetag”不同(请注意,我在答案中小写了开始标签;如果这是错误的,则将其大写)。
样品运行
鉴于您的前三行“file2”和...
来源html:
<uniquetag>other</uniquetag>
<othertag>other</othertag>
<uniquetag>Mystring1</uniquetag>
<uniquetag>other</uniquetag>
<uniquetag>Mystring2</uniquetag>
<othertag>other</othertag>
<uniquetag>Mystring3</uniquetag>
<uniquetag>other</uniquetag>
<othertag>Mystring3</othertag>
输出是:
<uniquetag>other</uniquetag>
<othertag>other</othertag>
<uniquetag>Mystring1 - Info1</uniquetag>
<uniquetag>other</uniquetag>
<uniquetag>Mystring2 - Info2</uniquetag>
<othertag>other</othertag>
<uniquetag>Mystring3 - Info3</uniquetag>
<uniquetag>other</uniquetag>
<othertag>Mystring3</othertag>