如果我有一个包含以下内容的文本文件:
someline
<!--\
file first read on 2015/01/11
我想删除<!--\
“on”之后的所有内容,我该怎么做?对于上面的示例,预期输出如下:
someline
2015/01/11
我无法制作提取日期的模式,因为2015/01/11
可以只是Sunday
或Yesterday
或几乎任何其他内容。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'
*?
是一个“节俭的星号”,这意味着“重复零次或多次,但匹配可能的最短字符串”。