匹配不包含特定模式的行,并在末尾附加字符串-Bash

时间:2019-07-31 14:27:15

标签: bash perl

我正在尝试搜索文件,并在与特定模式不匹配的每一行的末尾附加特定的字符串。

这是文件的一部分:

<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/>

有人可以告诉我我在做什么错吗?

3 个答案:

答案 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输入也是输出。