Tell sed para fazer mudanças, mas aquelas que começam com uma string específica na 8ª a última linha

1

Aqui novamente com outro problema com sed .

Como diz o título, quero que sed altere as linhas começando na oitava linha até o final, mas apenas as linhas que começam com <b> .

Eu tenho código pronto e só queria acrescentar o argumento para alterar as linhas começando com <b> .

Exemplo de código sed -e '8,$ { s/\./%code%<\/b>/ }' > "$file"_new

Exemplo de entrada:

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

Exemplo de saída:

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

Essas linhas estão situadas da 8ª linha até o final. Eu não quero qualquer tipo de mudança na linha 1-7th.

    
por 22lk94k943 only 04.05.2013 / 14:45

1 resposta

2

Isso deve atender às suas necessidades

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>.*\.$/
sed '8~1s/^<b>[^\.]*\./
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>.*\.$/
sed '8~1s/^<b>[^\.]*\./%pre%<\/b>/' < TestSed.txt
<\/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>
<\/b>/' < TestSed.txt
<\/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>

O sed aqui faz a substituição s/Regular Expression To Search/Replacement Text/ e aplica essa expressão regular ^<b>.*\.$ sobre cada linha lida e quando ela corresponde, ela a substitui por ^<b>.*\.$<\/b> . Aqui \ 0 refere-se ao texto que corresponde à expressão regular ^<b> .

<b> corresponderá às linhas que começam com .*

^<b>.* corresponderá a zero ou mais caracteres. Então,

<b> corresponderá às linhas que começam com ^<b>.*\.$ e têm zero ou mais caracteres depois disso.

<b> corresponderá às linhas que estão iniciando com . e terão zero ou mais caracteres depois disso e terminarão com \.

\/ no texto de substituição fornecerá o texto que correspondeu à expressão regular. No nosso caso, é toda a linha.

. , / as barras invertidas são usadas aqui para escapar de 8~1 e . . Ambos têm um significado especial em expressões regulares. Queremos tratá-los como cordas aqui. Então estamos escapando deles.

[^\.] informa ao sed para começar a aplicar a substituição da linha 8 e aplicá-la após cada 1 linha, o que significa o restante do arquivo. Se você observar o exemplo, ele não fará nenhuma alteração na Linha 3 e na Linha 6, embora eles correspondam à expressão regular.

EDITAR:

%pre%

Isso corresponderá ao texto até o primeiro .

[^\.]* corresponderá a qualquer caractere, exceto .

%code% corresponderá a qualquer caractere, exceto %code% , zero ou mais vezes.

O resto das explicações é o mesmo.

    
por thefourtheye 05.05.2013 / 04:41