刚学习sed,我觉得我已经接近做我想做的事情,只是错过了一些明显的东西。
目标是在html表中加入一堆<tr>...</tr>
并将其附加到另一页中的单个表中。所以我想获取初始文件,在我第一次使用<tr>
以及</table>
下的所有内容时将所有内容都删除,然后将其插入另一个文件中</table>
的正上方。如下所示,除了<tr>
和</tr>
之外,如果重要的话,除了Input File: Target File:
<html><body> <html><body>
<p>Whatever...</p> <p>Other whatever...</p>
<table> <table>
<tr><td>4</td></tr> <thead>
<tr><td>5</td></tr> <tr><th>#</th></tr>
<tr><td>6</td></tr> </thead>
</table> <tbody>
</body></html> <tr><td>1</td></tr>
<tr><td>2</td></tr>
<tr><td>3</td></tr>
</tbody>
</table>
</body></html>
和 Input file Target File:
doesn't matter. <html><body>
<p>Other whatever...</p>
<table>
<thead>
<tr><th>#</th></tr>
</thead>
<tbody>
<tr><td>1</td></tr>
<tr><td>2</td></tr>
<tr><td>3</td></tr>
<tr><td>4</td></tr>
<tr><td>5</td></tr>
<tr><td>6</td></tr>
</tbody>
</table>
</body></html>
之外。
#!/bin/bash
#$1 is the first parameter and $2 is the second parameter being passed when calling the script. The variable filename will be used to refer to this.
input=$1
inserttarget=$2
sed -e '/\<\/thead\>,$input' $input
sed -e '/\<\/table\>,$input' $input
sed -n -i -e '\<\/tbody\>/r' $inserttarget -e 1x -e '2,${x;p}' -e '${x;p}' $input
变为:
cars,ford,carsforsale
这是我正在尝试使用的代码:
ford
非常确定这很简单,只是弄乱了表达。谁能让我直截了当?
答案 0 :(得分:0)
这里我将问题分为两个: 1.从输入中剪切行 2.将这些行粘贴到输出文件
中sed -n '\:<table>:,\:</table>:p' ${input} | sed -n '\:<tr>:p'
此行将删除块中包含<tr>
的所有行,范围从匹配<table>
的第一行到匹配</table>
的第一行。所有这些新切割的线都打印在标准输出中。
sed -i '\:</tbody>: {
r /dev/stdin
a </tbody>
d}' ${inserttarget}
此多行命令将在匹配stdin
的行之后添加从</tbody>
读取的行。然后,我们通过在新行后添加并移除旧行来移动</tbody>
。
此处使用的另一个技巧是用/
替换默认的正则表达式分隔符:
,这样我们就可以在匹配模式中使用'/'。
最终sotuion :
sed -i '\:</tbody>: {
r /dev/stdin
a </tbody>
d}' ${inserttarget} < <(sed -n '\:<table>:,\:</table>:p' ${input} | sed -n '\:<tr>:p')
Et瞧!