Regex sed-在模式中包含换行符

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>

我仍然是一个编写脚本的新手,但我正在努力。下面是一个部分工作的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>

//福
将删除第一个脚本标记,但将省略我不想要的“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'
或者,如果您使用GNU
sed
且不需要跨平台兼容性,则以更精简的形式:

… |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'