如何在开始时插入<raj>,使用sed在文本末尾插入</raj>?

时间:2014-12-17 00:41:07

标签: shell sed

我需要编写一个shell脚本,该脚本应检查文本文件是否包含<raj></raj>。如果文本文件包含<raj>,那么我们需要单独添加</raj>,反之亦然;如果它不包含,则添加两者。

我的文字文件包含以下内容。

1123
1111
2222
3333

我想要下面的输出。

<raj>
1123
1111
2222
3333
</raj>

3 个答案:

答案 0 :(得分:2)

这就是工作:

sed -e '1{/^<raj>/!i\
<raj>
}
${/^<\/raj>/!a\
</raj>
}' data.4

在第一行,如果该行与<raj>不匹配,请在当前行之前插入<raj>。 在最后一行,如果该行与</raj>不匹配,请在当前行后添加</raj>

对于下面四个输入文件中的每一个,上面的脚本生成的输出与最后一个输入(data.4)匹配。

data.1

1123
1111
2222
3333

data.2

<raj>
1123
1111
2222
3333

数据。3

1123
1111
2222
3333
</raj>

数据。4

<raj>
1123
1111
2222
3333
</raj>

删除迷路标记

如果输出应该在顶部有<raj>标记,在底部有</raj>,并且应该删除任何插入标记,那么这个修改后的脚本将完成这项工作。它实际上更简单。它在第1行之前输出<raj>;它在最后一行之后输出</raj>;它会删除从<raj></raj>开始的任何行。

sed -e '1i\
<raj>
$a\
</raj>
/^<raj>/d
/^<\/raj>/d'

它在data.1 ... data.4上生成与以前相同的输出。

data.5

== data.5 ==

1123
1111
2222
3333
<raj>
1123
1111
2222
3333
</raj>
1123
1111
2222
3333
</raj>

给定data.5,输出为:

<raj>
1123
1111
2222
3333
1123
1111
2222
3333
1123
1111
2222
3333
</raj>

如果那不是您所追求的,那么您需要更仔细地指定您想要的内容。

答案 1 :(得分:1)

sed -n 'H;${x
 /\n<raj>/ !s/./&<raj>&/
 \#\n</raj># !s#\(.\).*#&</raj>\1#
 s/.//p
 }' YourFile

将整个文件加载到缓冲区中,而不是检查标记的存在,如果丢失则添加它。每个标签检查1次。最后打印结果

答案 2 :(得分:0)

您可以使用以下Perl命令。

perl -0777pe 's/^<raj>\n|\n<\/raj>$//s;s/(.*)/<raj>\n\1<\/raj>\n/s' file

如果您不关心将整个文件一次性压入内存,那么您可以使用上面的perl one-liner命令。