我正在尝试搜索文件,并在与特定模式不匹配的每一行的末尾附加特定的字符串。
这是文件的一部分:
<h3>Release: </h3>
** Commit to create release
** Add firmware
<h4>Application changes: </h4>
** Add testfunction <br/>
** Add update support to application<br/>
我想在丢失的每一行的末尾添加<br/>
(如果它不是标题,那么基本上任何不以>结尾的行)。
我尝试在Perl中使用> and empty space after that
匹配所有以^(?!.*>\s*)
结尾的行:
perl -pe 's/^(?!.*>\s*)/$&<br\/>/' temp.html > output.html
它可以找到该行,但是不幸的是,即使我在匹配的行之后附加$&<br\/>
,它也会附加到该行的开头。我想在末尾附加<br/>
。
我的代码输出:
<h3>Release: </h3>
<br/>** Commit to create release
<br/>** Add firmware
<h4>Application changes: </h4>
** Add testfunction <br/>
** Add update support to application<br/>
我想要的输出:
<h3>Release: </h3>
** Commit to create release <br/>
** Add firmware <br/>
<h4>Application changes: </h4>
** Add testfunction <br/>
** Add update support to application<br/>
有人可以告诉我我在做什么错吗?
答案 0 :(得分:3)
我认为您的意思是这样的,使用否定的后置断言:
\s*
请注意,我删除了if
-这是因为Perl正则表达式引擎不支持可变长度的后向查找。我还要注意,这在我的系统上出现空行问题。
如何使用perl -pe 's/$/<br\/>/ if !/\>\s*$/ && !/^\s*$/' temp.html > output.html
代替简单的内容?
grep -wo -- "-[^ ]*"
答案 1 :(得分:1)
sed 's#[^>[:space:]]$#<br/>#g' temp.html >output.html
s
:是sed
搜索和替换命令。#
:是sed
命令参数分隔符。[^>[:space:]]$
:在行>
的末尾没有[:space:]
或$
字符的搜索模式。<br/>
:是模式的替代物。g
:告诉sed
在文件中的所有位置应用搜索替换。答案 2 :(得分:0)
我建议为此使用sed。
以下命令将提取<br\>
作为第一个参数,然后将其余的行提取为第二个参数,然后交换位置。
sed -i -Ee 's/(<br\/>)(.*)/\2\1/g' $file
使用-i
输入也是输出。