问题描述
|
如何移除:
<p> (break line!!!)
text...
</p> (break line!!!)
从正则表达式的文件?
我试过了:
find . -type f -exec perl -p -i -e \"s/SEARCH_REGEX/REPLACEMENT/g\" {} \\;
解决方法
这些东西真的会炸掉你的脸,所以要小心。尝试在测试目录等中使用测试数据
-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解析器。
,几种方法可以做到这一点。
首先是取消$\\
的定义。
然后你匹配类似
/\\<p\\>\\nTERRANO.*\\n\\<\\/p\\>/
这可能取决于您使用的是cr / lf \,还是仅使用lf \ /
第二个方法是使用循环连接线(加上$\\
中的所有内容)并匹配一个正则表达式中的行,包括匹配$\\
中的任何内容。
第三是使用File :: Slurp。
第四是使用多个正则表达式和一个循环来匹配每一行,如果满足所有三个条件,请进行替换。
,您也可以使用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
,您可能要使用多行正则表达式:
s/regexp/replacement/m
看这里