Скажите 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
задан 5 May 2013 в 07:27

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

Это будет соответствовать тексту до первого .

[^\.] будет соответствовать любому символу кроме .

[^\.]* будет соответствовать любому символу кроме ., нуль или больше раз.

Отдых объяснений является тем же.

2
ответ дан 5 May 2013 в 07:27

Другие вопросы по тегам:

Похожие вопросы: