如何删除:
<p> (break line!!!)
text...
</p> (break line!!!)
来自带有正则表达式的文件?
我试过了:
find . -type f -exec perl -p -i -e "s/SEARCH_REGEX/REPLACEMENT/g" {} \;
答案 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)