Regex sed-在模式中包含换行符
我仍然是一个编写脚本的新手,但我正在努力。下面是一个部分工作的shell脚本,它应该通过匹配标记并删除其包含的内容来删除*.htm文档中的所有JS。例如Regex sed-在模式中包含换行符,regex,shell,sed,cygwin,Regex,Shell,Sed,Cygwin,我仍然是一个编写脚本的新手,但我正在努力。下面是一个部分工作的shell脚本,它应该通过匹配标记并删除其包含的内容来删除*.htm文档中的所有JS。例如,和 find$1-name“*.htm”>。/patterns 对于以美元表示的p(类别/模式) 做 sed-e“s///g”$p#>tmp.htm;mv tmp.htm$p 完成 此is脚本的问题在于,由于sed逐行读取文本输入,因此此脚本在新行中无法按预期工作。运行: <script> //Foo </script>
,
和
find$1-name“*.htm”>。/patterns
对于以美元表示的p(类别/模式)
做
sed-e“s///g”$p#>tmp.htm;mv tmp.htm$p
完成
此is脚本的问题在于,由于sed逐行读取文本输入,因此此脚本在新行中无法按预期工作。运行:
<script>
//Foo
</script>
//福
将删除第一个脚本标记,但将省略我不想要的“foo”和closing标记
有没有办法匹配正则表达式中的新行字符?或者如果
sed
不合适,还有什么我可以使用的吗?此awk
脚本将查找
标记,在变量中设置,然后读取下一行。当找到关闭标记时,变量设置为零。如果
变量中的为零,则最终打印图案输出所有行
awk '/<script.*>/ { in=1; next }
/<\/script.*>/ { if (in) in=0; next }
{ if (!in) print; } ' $1
awk'/{in=1;next}
//{if(in)in=0;next}
{if(!in)print;}'$1
假设您在不同的行上有
标记,例如:
foo
bar
<script type="text/javascript">
some JS
</script>
foo
foo
酒吧
一些JS
福
以下方面应起作用:
sed '/<script/,/<\/script>/d' inputfile
sed'/正如您所提到的,问题是sed
逐行处理输入
因此,最简单的解决方法是将输入设为单行,例如,用您确信输入中不存在的字符替换换行符
人们可能会尝试使用tr
:
… |tr '\n' '_'|sed 's~<script>.*</script>~~g'|tr '_' '\n'
或者,如果您使用GNUsed
且不需要跨平台兼容性,则以更精简的形式:
… |sed ':a;N;$!ba;s/\n/ˇ/g;s~<script>.*</script>~~g;s/ˇ/\n/g'
。| sed:a;N、 美元!文学士;s/\n/g;s~.~~~~~g;s/ˇ/\n/g'
有关分支部分的详细信息,请参阅“使用分支”下的链接答案(:a;N;$!ba;
)。剩下的部分很简单:
s/\n/ˇ/g
用ˇ
替换所有换行符李>
s~.*~~g
删除需要删除的内容(请注意,实际使用时需要一些安全保护:它将删除第一个
和最后一个
之间的所有内容;此外,请注意,我使用了~
而不是//code>,以避免
中的斜杠转义:除了少数保留字符外,我几乎可以使用任何单字节字符。)ike\
)
s/ˇ/\n/g
读取换行符
已测试。它有效。我唯一的问题是,同一行上的字符与脚本标记一起被替换。例如,foo-foo将导致foo。很抱歉,我没有Windows-因此无法调整脚本。请注意,如果您需要执行不依赖于分支的操作,使用管道sed可能更明智e> 输出到一个新的sed
实例(我自己在同一个实例中遇到了一些操作问题,其他的则没有)。
… |sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ˇ/g' -e 's~<script>.*</script>~~g' -e 's/ˇ/\n/g'
… |sed ':a;N;$!ba;s/\n/ˇ/g;s~<script>.*</script>~~g;s/ˇ/\n/g'