2017-10-11 78 views
0

这可能是一个Sed和shell脚本语法问题以及正则表达式。 (编辑:也许一个I/O问题,因为正则表达式读取时使用bash shell中的文件,但实际.txt文件并没有改变作为所需的工作)Sed正则表达式OSX找到罗马数字并用空字符串替换。错误“未终止的替代模式”

尝试准备一个.txt文件对于一些自然语言处理工作。想要在包含莎士比亚的十四行诗的纯文本文件中删除一些罗马数字,每个十四行诗以一个罗马数字开头,如IX.XVIII.,它表示单个十四行诗的标题,包括十进制字符。

例intput文本:

XXV.

Let those who are in favour with their stars

Of public honour and proud titles boast,

希望的输出:

Let those who are in favour with their stars

Of public honour and proud titles boast,

this question的例子中,我尝试了所有在终端的bash以下命令:

$ 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

你能粘贴示例文本吗?什么是输入和你喜欢输出的样子。 ? –

+0

我认为'{'和'}'需要被转义。 '\ {'和'\}'。方括号也可能需要不确定。 –

+0

'{} []'在https://regexr.com/ – Elan

回答

1

由于@Jonathan莱弗勒在评论中提到的,我的Mac使用BSD sed,这就是为什么该命令没有工作。

因此,我通过自制安装GNU sed

brew install gnu-sed

然后使用下面的命令:

gsed -i 's/[IVXLC]\{1,\}[.]//g' sonnets.txt

打字在gsed调用GNU sed,和它的工作如期望。它改变了.txt文件的内容。

在这种配置中,如@Hakan巴巴所提到的,正则表达式也需要转义花括号:

\{\}

+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, 
0

的问题似乎是与范围(或限制性)量词{m,n}这在您的BSD sed版本中不受支持。请注意,您可以重写使用[IVXLC][IVXLC]*(一个罗马“数字”,随后与0+罗马数字)的{1,}量词:

sed -i 's/[IVXLC][IVXLC]*[.]//g' sonnets.txt 
      ^^^^^^^^^^^^^^^ 

另外,如果你需要确保你只在的开始匹配罗马数字行,在模式开始时追加^(这意味着您也可以在正则表达式结尾处省略g修饰符)。要将它们匹配为整个单词,请在模式开始处添加[[:<:]]前导单词边界。

+0

有趣的想法与'[IVXLC] [IVXLC] *'!对于我正在处理的这个特定文件,它包含超过100个罗马数字,表示莎士比亚所写的所有十四行诗。标记整个文本输入的开始和结尾的'^'和'$'字符可能不适用。 – Elan

+0

但是,'[[:<:]]'初始字边界可能是有趣的。 –