Здесь снова с другой проблемой с 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-й строке.
Это должно соответствовать Вашим требованиям
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
Это будет соответствовать тексту до первого .
[^\.]
будет соответствовать любому символу кроме .
[^\.]*
будет соответствовать любому символу кроме .
, нуль или больше раз.
Отдых объяснений является тем же.