sed:在某个位置插入一条线

时间:2013-03-21 18:51:25

标签: linux bash sed

我只是环顾四周,但我找不到任何对我有用的东西。 我想在其他行的顶部插入一个新行(基本上是一个html表行)。

<table id="tfhover" class="tftable" border="1">
<tr><th>HEADER1</th><th>HEADER2</th><th>HEADER3</th><th>HEADER4</th></tr>
<tr><td>Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td></tr>
</table>

那么,是否有人可以向我推荐一个将插入新内容的sed cmd:

<tr><td>Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td>

就在HEADERS的下方?

谢谢!

1 个答案:

答案 0 :(得分:7)

首先,我们有一个包含以下行的文件,名为datafile.txt

1 some test lines here
but not all lines contain nubers
3 and here is the last one

我们有一个bash变量$ADDED,其中包含想要添加的行内容

ADDED="==This is the new line=="

因此,在第一行之后添加行

ADDED="==This is the new line=="
< datafile.txt sed "1a \\
$ADDED
"

结果:

1 some test lines here
==This is the new line==
but not all lines contain nubers
3 and here is the last line

在所有行之后添加以数字

开头的行
< datafile.txt sed "/^[0-9]/a \\
$ADDED
"

结果:

1 some test lines here
==This is the new line==
but not all lines contain nubers
3 and here is the last line
==This is the new line==

在开头添加行,因此在第一行之前插入

< datafile.txt sed "1i \\
$ADDED
"

结果

==This is the new line==
1 some test lines here
but not all lines contain nubers
3 and here is the last line

您可以“替换”该行的末尾以添加新的

< datafile.txt sed "/all/s/$/\\
$ADDED/"

上面的示例在行之后添加行,其中包含替换

的单词“all”
1 some test lines here
but not all lines contain nubers
==This is the new line==
3 and here is the last line

您甚至可以拆分行并在

之间添加
< datafile.txt sed "/all/s/\(.*lines \)\(.*\)/\1\\
$ADDED\\
\2/"

上面将搜索包含单词“all”的行,并在单词“lines”之后将其拆分。结果:

1 some test lines here
but not all lines 
==This is the new line==
contain nubers
3 and here is the last line

最后一件事。使用regural表达式解析 HTML是不可能的,请查看sputnik评论中的链接。

但是,这并不意味着匹配 HTML文件的某些部分。如果你知道你想要什么匹配(而不是解析) - 你也可以安全地使用HTML的正则表达式。简单地说,这里的许多人都不知道解析和匹配之间的区别。

因此,如果您的html文件具有众所周知的结构,例如你确定比你的html一直都是上面的结构,你可以安全地写:

<your_file.html sed "/^<tr><th>/a \\
<tr><td>new Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td>
"

你会得到

<table id="tfhover" class="tftable" border="1">
<tr><th>HEADER1</th><th>HEADER2</th><th>HEADER3</th><th>HEADER4</th></tr>
<tr><td>new Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td>
<tr><td>Row:1 Cell:1</td><td>Row:1 Cell:2</td><td>Row:1 Cell:3</td><td>Row:1 Cell:4</td></tr>
</table>

仅仅因为我们 NOT PARSING html代码,我们只是 MATCHING 一些线条模式..