如何用其中的换行符替换该模式?

如何用其中的换行符替换该模式?

如果我有一个包含以下内容的文本文件:

 someline
 <!--\
      file first read on 2015/01/11

我想删除<!--\“on”之后的所有内容,我该怎么做?对于上面的示例,预期输出如下:

someline
2015/01/11

我无法制作提取日期的模式,因为2015/01/11可以只是SundayYesterday或几乎任何其他内容。read也可以是任何东西。我用 BSD 尝试过sed

sed 's/<!--\
     file first .* on//g'

但是当我运行这个命令时,我收到这个错误:

sed: 1: "s/<!--\
        file f ...": unterminated substitute pattern

所以我尝试了反斜杠转义<!但我得到了相同的“未终止的替代模式”错误。我尝试安装 GNU sed 并做同样的事情,除了\n,我也尝试过,gsed 's/<!--:a;N;$!ba;s/\n/file first .* on//g'但我得到了:

gsed: -e expression #1, char 22: unknown option to `s'

不能sed这样做吗?如果没有,我该如何使用其他工具/语言来做到这一点?

答案1

POSIXly:

$ sed -e '/<!--/{
  $!N
  s/.*on //
}' <in >out

答案2

以下sed命令应该执行您想要的操作:

sed '/^<!--/{N; s/.*on *//}' inputfile

<!--首先,我们在行的开头搜索正则表达式,然后使用N命令将下一行附加到它并删除(实际上什么都不替换)直到并带有“on”的所有内容。

有人声称,每当您在 中使用大写字母命令时sed,例如N,您就使用了错误的工具......

答案3

Perl 可以使用 读取整个文件-0777/s修饰符也可以.匹配换行符:

perl -0777 -pe 's/<!--\\.*?on //gs'

*?是一个“节俭的星号”,这意味着“重复零次或多次,但匹配可能的最短字符串”。

相关内容