如何从文件中删除换行符?

时间:2011-04-15 14:55:13

标签: regex linux perl bash programming-languages

如何删除:

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

来自带有正则表达式的文件?

我试过了:

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

4 个答案:

答案 0 :(得分:2)

这些东西真的在你的脸上爆炸所以要小心;尝试使用测试目录等中的测试数据。

-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" {} \;

如评论中所述,如果内容 HTML,您可能应该使用HTML解析器。

答案 1 :(得分:0)

有几种方法可以做到。

首先是undef $\。 然后你匹配像

这样的东西

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

这可能取决于你是否使用cr / lf,或者仅仅是lf / /

其次是使用循环来连接线(以及$\中的任何内容)并匹配一个正则表达式,包括匹配$\中的任何内容。

第三种方法是使用File :: Slurp。

第四是使用几个正则表达式和一个循环来匹配每一行,如果满足所有这三个,那么做替换。

答案 2 :(得分:0)

您也可以使用Unix文本编辑器删除一系列带有正则表达式的行:

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

答案 3 :(得分:-1)

您可能想要使用多行正则表达式:

s/regexp/replacement/m

请参阅here