我需要编写一个shell脚本,该脚本应检查文本文件是否包含<raj>
和</raj>
。如果文本文件包含<raj>
,那么我们需要单独添加</raj>
,反之亦然;如果它不包含,则添加两者。
我的文字文件包含以下内容。
1123
1111
2222
3333
我想要下面的输出。
<raj>
1123
1111
2222
3333
</raj>
答案 0 :(得分:2)
这就是工作:
sed -e '1{/^<raj>/!i\
<raj>
}
${/^<\/raj>/!a\
</raj>
}' data.4
在第一行,如果该行与<raj>
不匹配,请在当前行之前插入<raj>
。
在最后一行,如果该行与</raj>
不匹配,请在当前行后添加</raj>
。
对于下面四个输入文件中的每一个,上面的脚本生成的输出与最后一个输入(data.4
)匹配。
1123
1111
2222
3333
<raj>
1123
1111
2222
3333
1123
1111
2222
3333
</raj>
<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 ==
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命令。