Как удалить разрывы строк из файла? - PullRequest
0 голосов
/ 15 апреля 2011

Как удалить:

<p> (break line!!!)
text...
</p> (break line!!!)

из файла с регулярным выражением?

Я пытался:

find . -type f -exec perl -p -i -e "s/SEARCH_REGEX/REPLACEMENT/g" {} \;

Ответы [ 4 ]

2 голосов
/ 15 апреля 2011

Этот материал может действительно взорваться на вашем лице, так что будьте осторожны;попробуйте это с тестовыми данными в тестовом каталоге и т. д.

Переключатель -0 "отключит" разделитель записей по умолчанию ($/), так что вы можете сделать несколько строк одновременно.s позволяет . совпадать на новых строках, а +? - сделать его ленивым до "TERRANO".Попробуйте этот тест на одном из ваших файлов.

perl -0 -p -e 's/<p>.+?TERRANO[^<]*<\/p>//gs'

Если это сработает, вы можете добавить его к своему оригиналу.

find . -type f -exec perl -0 -pi -e "s/<p>.+?TERRANO[^<]*<\/p>//gs" {} \;

Как указано в комментарии, если содержание is HTML, возможно, вам следует использовать анализатор HTML.

0 голосов
/ 16 апреля 2011

Вы также можете использовать текстовый редактор Unix ed для удаления диапазона строк с помощью регулярного выражения:

str='
BEFORE MULTILINE PATTERN 1
<p> (break line!!!)
text...
</p> (break line!!!)
AFTER MULTILINE PATTERN 1
BEFORE MULTILINE PATTERN 2 
<p> (break line!!!)
text...
</p> (break line!!!)
AFTER MULTILINE PATTERN 2
'

# for in-place file editing use "ed -s file" and replace ",p" with "w"
# cf. http://wiki.bash-hackers.org/howto/edit-ed

cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' -e '/^ *#/d' | ed -s <(echo "$str")
  H
  # only remove the first match
  #/<p>/,/<\/p>/d
  # remove all matches
  g/<p>/+0,/<\/p>/+0d
  ,p
  q
EOF
0 голосов
/ 15 апреля 2011

Вы можете использовать регулярное выражение:

s/regexp/replacement/m

См. здесь

0 голосов
/ 15 апреля 2011

Несколько способов сделать это.

Во-первых, undef $\.Затем вы сопоставляете что-то вроде

/\<p\>\nTERRANO.*\n\<\/p\>/

, что может зависеть от того, используете ли вы cr / lf или просто lf's /

Второй - использовать циклобъединить строки (плюс все, что находится в $\) и сопоставить их в одном регулярном выражении, включая сопоставление с тем, что находится в $\.

Третье - использовать File :: Slurp.

Четвертое - использовать несколько регулярных выражений и цикл для сопоставления каждой строки, и, если все три удовлетворены, сделайте замену.

...