这可能是Sed和shell脚本语法问题以及Regex。
(编辑:可能是一个I / O问题,因为在bash shell中读取文件时正则表达式有效,但实际的.txt
文件未按要求更改)
尝试为某些自然语言处理工作准备.txt
文件。想要在包含莎士比亚十四行诗的纯文本文件中删除一些罗马数字,每个十四行诗以罗马数字开头,如IX.
和XVIII.
,代表个人十四行诗的标题,包括十进制字符。
示例输入文本:
XXV。
让那些赞成他们明星的人
公益荣誉和自豪头衔夸耀,
期望的输出:
让那些赞成他们明星的人
公益荣誉和自豪头衔夸耀,
按照this question中的示例,我在Terminal bash shell中尝试了以下所有命令:
$ sed -i 's/[IVXLC]{1,}[.]//g' sonnets.txt
$ sed -i 's/[IVXLC]{1,}[.]/^$/g' sonnets.txt
$ sed -i 's/[IVXLC]{1,}[.]/()/g' sonnets.txt
$ sed -i 's/[IVXLC]{1,}[.]/[]/g' sonnets.txt
想法是用空字符串替换任何匹配。由于那不起作用,我试图用空格字符替换匹配:
$ sed -i 's/[IVXLC]{1,}[.]/^ $/g' sonnets.txt
没有运气。上面的所有命令都返回了相同的错误:
sed: 1: "sonnets.txt": unterminated substitute pattern
我测试了"发现"中的正则表达式https://regexr.com/上的字段似乎是正确的。目标文件位于工作目录中。知道出了什么问题吗?我应该在"替换"中使用哪些字符? Sed命令的字段?我应该修改正则表达式和/或Sed命令吗?
答案 0 :(得分:1)
需要对花括号进行转义。
$ sed 's/[IVXLC]\{1,\}[.]//g' sonnets.txt
Let those who are in favour with their stars
Of public honour and proud titles boast,
答案 1 :(得分:1)
正如@Jonathan Leffler在评论中提到的,我的Mac正在使用BSD sed
,这就是为什么命令不起作用的原因。
所以我通过Homebrew安装了GNU sed
:
brew install gnu-sed
然后使用命令:
gsed -i 's/[IVXLC]\{1,\}[.]//g' sonnets.txt
键入gsed
会调用GNU sed
,并且可以根据需要运行。它改变了.txt
文件的内容。
在这种配置中,正如@Hakan Baba所提到的,正则表达式确实需要逃避花括号:
\{
\}
答案 2 :(得分:0)
问题似乎与您的BSD {m,n}
版本不支持的范围(或限制)量词sed
有关。请注意,您可以使用{1,}
重写[IVXLC][IVXLC]*
量词(一个罗马"数字"后跟0 +罗马数字):
sed -i 's/[IVXLC][IVXLC]*[.]//g' sonnets.txt
^^^^^^^^^^^^^^^
此外,如果您需要确保只匹配行首的罗马数字,请在模式的开头添加^
(这意味着您也可以省略g
修饰符在正则表达式的末尾)。要将它们作为整个单词进行匹配,请在模式的开头添加[[:<:]]
前导单词边界。