是否在命令行中以同一行中的一个单词为条件更改另一个单词



我得到了一个html文件,如下所示(删除一些不有用的单词(。

<li class="toctree-l1">examples</a></li>
<li class="toctree-l3">charcnn</a></li>
<li class="toctree-l4">cifar10</a></li>

我想要的是在不进入文件的情况下编辑它(例如sed命令(。我有一个dict,它是

dict = {'example':l1, 'charcnn':l2, 'cifar10':l3}

dict之后,html文件应该是

<li class="toctree-l1">examples</a></li>
<li class="toctree-l2">charcnn</a></li>
<li class="toctree-l3">cifar10</a></li>

更换前为l1l3l4。之后是l1l2l3

我知道sed命令可以用关键字替换,但它是用来替换当前单词的。有没有一种方法可以在同一行中的一个单词的条件下替换另一个单词?

当然,sed可以根据字符串的不同部分替换字符串的一部分。

对于您的示例数据,您可以使用

sed 's#(<li class="toctree-)[^"]*(">examples</a></li>)#1l12#
s#(<li class="toctree-)[^"]*(">charcnn</a></li>)#1l22#
s#(<li class="toctree-)[^"]*(">cifar10</a></li>)#1l32#' inputfile

命令检查整个输入字符串,但允许toctree-"之间的任何内容。

有了这个(修改的(输入

<li class="toctree-l1">examples</a></li>
<li class="toctree-l3">charcnn</a></li>
<li class="toctree-l4">cifar10</a></li>
<li class="toctree-something">other</a></li>
<li class="toctree-foo">examples</a></li>
<li class="toctree-bar">charcnn</a></li>
<li class="toctree-baz">cifar10</a></li>

输出是

<li class="toctree-l1">examples</a></li>
<li class="toctree-l2">charcnn</a></li>
<li class="toctree-l3">cifar10</a></li>
<li class="toctree-something">other</a></li>
<li class="toctree-l1">examples</a></li>
<li class="toctree-l2">charcnn</a></li>
<li class="toctree-l3">cifar10</a></li>

如果您在字典中有替换的参数(dict(,您可以编写一些代码,从字典中生成sed命令,格式为
s#(<li class="toctree-)[^"]*(">key</a></li>)#1value2#

根据您的需要,您可以使用不同或更短的模式,如

s#("toctree-)[^"]*(">examples<)#1l12#

在评论中澄清问题后编辑

要修改原始文件,您可以将sed输出保存在新文件中,成功后将其重命名为原始文件名,例如

sed -e 'sed-command' inputfile > outputfile && mv outputfile inputfile

或者使用-i选项(就地编辑((如果可用(

sed -i -e 'sed-command' inputfile

(请注意,如果您的命令包含错误,您可能会丢失原始输入。(

awk -v dict="{'example':l1, 'charcnn':l2, 'cifar10':l3}" '
BEGIN{ 
dict1=gensub(/[}{'"'"' ]/,"","g",dict);
split(dict1,map,",") } 
/toctree/ {
cnt++;
split(map[cnt],map1,":");
print "<li class="toctree-"map1[2]"">"map1[1]"</a></li>" }
' htmlfile

一个衬垫:

awk -v dict="{'example':l1, 'charcnn':l2, 'cifar10':l3}" 'BEGIN{ dict1=gensub(/[}{'"'"' ]/,"","g",dict);split(dict1,map,",") } /toctree/ {cnt++;split(map[cnt],map1,":");print "<li class="toctree-"map1[2]"">"map1[1]"</a></li>" }' htmlfile

假设";toctree";在html文件中没有其他位置存在,您可以尝试上面的操作。首先将dict作为变量传递给awk,然后在开始块中,去掉不必要的字符,并使用split函数将条目放置在一个名为map的数组中。然后,我们用toctree搜索任何行,增加计数器cnt,使用":"作为分隔符,并根据需要打印格式化的字符串。

印刷品无疑需要加工以确保压痕正确。

最新更新