Sed Regex OSX找到罗马数字并用空字符串替换。错误"未终止的替代模式"

时间:2017-10-11 03:21:28

标签: regex bash macos shell sed

这可能是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命令吗?

3 个答案:

答案 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修饰符在正则表达式的末尾)。要将它们作为整个单词进行匹配,请在模式的开头添加[[:<:]]前导单词边界。