Заменить текст с помощью sed - PullRequest
0 голосов
/ 01 декабря 2011

Программа создает файлы HTML из базы данных.Между заголовками есть заголовки и прочее.

Количество заголовков не установлено.После каждого заголовка программа помещает текст:

$WHITE*("5")$ 

$WHITE*("20")$ 
$HRULE$ 

Мне нужно заменить каждое вхождение этих 4 строк на:

$WHITE*("20")$ 
$HRULE$ 
$WHITE*("10")$ 

Я не смущаюсь, какая программа используется :)

Я пробовал:

sed 's:\$WHITE\*(\"5\")\$\n\n\$WHITE\*(\"20\")\$\n\$HRULE\$:\$WHITE\*(\"20\")\$\
\$HRULE$\
\$WHITE*("10")$:g'

и различные другие перестановки

Ответы [ 4 ]

1 голос
/ 01 декабря 2011

Если это ваш входной файл, и это спецификация, вы можете сделать:

sed -n '3,$p;$a$WHITE*("10")$' INPUTFILE

Но я предполагаю, что это не так, поэтому вы можете перефразировать ваш вопрос и / или дать еще несколько деталей.

Более конкретное решение с помощью sed:

 sed '/^\$WHITE\*("5")\$$/,/^$/d;/\$HRULE\$/ a$WHITE*("10")$' INPUTFILE

(Ищет строку $WHITE*("5")$ и удаляет ее до (включая!) Следующей пустой строки. Затем ищет следующую строку $HRULE$ и добавляет строку $WHITE*("10")$.

awk решение:

 awk '/\$WHITE\*\("5"\)\$/ { getline ; next } 
      /\$WHITE\*\("20"\)\$/ { print ; 
                              getline ; 
                              if ($0 ~ /\$HRULE\$/) { print ; 
                                                      print "$WHITE*(\"10\")$" ;
                                                    }
                              else { print }
                            }
      1 ' INPUTFILE 

Это читает файл и печатает каждую строку - вот почему там есть 1, кроме случаев, когда он находит шаблон $WHITE*("5"), который отбрасывает его, читает следующую строку и тоже отбрасывает. если он находит, $WHITE*("20") печатает его. Читает следующую строку, и если она $HRULE$, то печатает ее и добавленную строку $WHITE*("10"). Остальное просто печатает строку.

НТН

0 голосов
/ 01 декабря 2011

Это может работать для вас:

 sed '/^\$WHITE\*(\"5\")\$/{N;N;N;s/.*\n\n\(\(\$WHITE\*(\"\)20\(\")\$\s*\)\n\$HRULE\$\s*$\)/\1\n\210\3/}' file

Пояснение:

Совпадение по первой строке $WHITE*("5")$, чтение следующих 3 строк и сопоставление по оставшейся части. Используйте группировки и обратные ссылки для формулирования выходных строк.

0 голосов
/ 01 декабря 2011

Попробуйте что-то вроде

 sed -e '${p;};/$WHITE\*("5")\$/,/$HRULE\$/{H;/$HRULE\$/{g;s/$HRULE\$//;s/20/10/;s/5/20/;s/\n/&$HRULE$/2p;s/.*//p;x;d;};d;};' white.txt

Сырой, но должно работать.

0 голосов
/ 01 декабря 2011

ОБНОВЛЕНИЕ № 2

Из sed faq, секция 4.23.3

Если вам нужно сопоставить статический блок текста (который может встречаться в файле любое количество раз), где содержимое блока известно заранее, тогда этот скрипт прост в использовании

ОБНОВЛЕНИЕ # 1

Python

$ cat input
first line
second line
3rd line
$WHITE*("5")$

$WHITE*("20")$
$HRULE$
some more lines
yet another
$WHITE*("5")$

$WHITE*("20")$
$HRULE$
THE END

скрипт:

#!/usr/bin/env python

## Use these 3 lines for python version < 2.5
#fd=open('input')
#text=fd.read()
#fd.close()

## Use these 2 lines for python version >= 2.5
with open('input') as fd:
    text=fd.read()

old="""$WHITE*("5")$

$WHITE*("20")$
$HRULE$
"""

new="""$WHITE*("20")$
$HRULE$
$WHITE*("10")$
"""

print text.replace(old,new)

выход:

first line
second line
3rd line
$WHITE*("20")$
$HRULE$
$WHITE*("10")$
some more lines
yet another
$WHITE*("20")$
$HRULE$
$WHITE*("10")$
THE END
...