告诉 sed 进行更改,但那些以倒数第 8 行中的特定字符串开头的更改

告诉 sed 进行更改,但那些以倒数第 8 行中的特定字符串开头的更改

这里又出现了另一个问题sed

正如标题所说,我想sed更改从第 8 行开始到末尾的行,但只更改以 开头的行<b>

我已经准备好所有代码,只想附加参数来更改以 开头的行<b>

代码示例sed -e '8,$ { s/\./\0<\/b>/ }' > "$file"_new

输入示例:

<b><font color="#000000"><p align="JUSTIFY">COAT. how are you.
<b><font color="#000000"><p align="JUSTIFY">MONEY.Where are you.
<b><font color="#000000"><p align="JUSTIFY">FOOD.what are you.
<font color="#000000"><p align="JUSTIFY">FOOD.what are you.
<b><font color="#000000"><p align="JUSTIFY">CAR.which are you.
<font color="#000000"><p align="JUSTIFY">CAR.which are you.
<b><font color="#000000"><p align="JUSTIFY">QUALITY.When are you.

示例输出:

<b><font color="#000000"><p align="JUSTIFY">COAT.</b>how are you.
<b><font color="#000000"><p align="JUSTIFY">MONEY.</b>Where are you.
<font color="#000000"><p align="JUSTIFY">FOOD.what are you.
<b><font color="#000000"><p align="JUSTIFY">FOOD.</b>what are you.
<b><font color="#000000"><p align="JUSTIFY">CAR.</b>which are you.
<font color="#000000"><p align="JUSTIFY">CAR.which are you.
<b><font color="#000000"><p align="JUSTIFY">QUALITY.</b>When are you.

这些行位于第 8 行至末尾。我不希望第 1 至第 7 行有任何变化。

答案1

这应该符合你的要求

cat TestSed.txt 

Line 1
Line 2
<b>Line 3.
Line 4
Line 5
<b>Line 6.
Line 7
Line 8
<b>Line 9.
Line 10.
<b>Line 11
<b>Line 12.

sed '8~1s/^<b>.*\.$/\0<\/b>/' < TestSed.txt

Line 1
Line 2
<b>Line 3.
Line 4
Line 5
<b>Line 6.
Line 7
Line 8
<b>Line 9.</b>
Line 10.
<b>Line 11
<b>Line 12.</b>

这里sed的 进行替换s/Regular Expression To Search/Replacement Text/,并将此正则表达式应用于^<b>.*\.$读取的每一行,当匹配时,将其替换为\0<\/b>。此处 \0 指的是与正则表达式匹配的文本^<b>.*\.$

^<b>将匹配以<b>

.*将匹配零个或多个字符。因此,

^<b>.*将匹配以 开头<b>且其后有零个或多个字符的行。

^<b>.*\.$将匹配以 开头<b>且之后有零个或多个字符并以 结尾的行.

\0在替换文本中将给出与正则表达式匹配的文本。在我们的例子中,它是整行。

\.\/这里使用反斜杠来转义./。它们在正则表达式中都有特殊含义。我们希望在这里将它们视为字符串。所以我们对它们进行了转义。

8~1告诉 sed 从第 8 行开始应用替换,并在每 1 行之后应用替换,这意味着文件的其余部分。如果您查看示例,它不会对第 3 行和第 6 行进行任何更改,尽管它们与正则表达式匹配。

编辑:

sed '8~1s/^<b>[^\.]*\./\0<\/b>/' < TestSed.txt

这将匹配文本直到第一个.

[^\.]匹配除以下字符之外的任何字符.

[^\.]*将匹配除 之外的任意字符.零次或多次。

其余解释相同。

相关内容