Mac上的Sed无法识别正则表达式

时间:2015-06-04 22:05:22

标签: regex macos sed terminal grep

在终端中,我正在尝试清理一些.txt文件,以便将它们导入到另一个程序中。只有文字搜索/替换似乎有效。我无法使正则表达式搜索起作用。

如果我尝试搜索并用文字字符串替换它,它可以工作:

find . -type f -name '*.txt' -exec sed -i '' s/Title Page// {} +;

(从每个文本文件中删除“标题页”)

但如果我尝试使用最基本的正则表达式,它就不起作用了:

find . -type f -name '*.txt' -exec sed -i '' s/\n\nDOWN/\\n<DOWN\>/ {} +;

(在每个文本文件中,重新格式化双重返回后的任何单词“DOWN”:删除额外的换行符并将单词放在括号中:“\ n”)

这不起作用。关于这一点,唯一可以“正则表达”的是寻找换行符。

我必须做错事。

非常感谢任何帮助。

更新:第2部分

John1024的回答帮助了我很多方面。

find . -type f -name '*.txt' -exec sed -i '' '/^$/{N; s/\n[0-9]+/\n/;}' {} +;

现在我无法让其他类型的正则表达式正确响应。上面的示例,我希望删除出现在行首的所有数字。

哎呀!我错过了什么?

1 个答案:

答案 0 :(得分:4)

默认情况下,sed一次只处理一行。当一行被读入sed的模式空间时,将删除换行符。

我看到您要查找空行后跟DOWN,找到后删除空行并将文本更改为<DOWN>。那可以做到。将此视为测试文件:

$ cat file
some
thing
DOWN

DOWN
other

尝试:

$ sed '/^$/{N; s/\nDOWN/<DOWN>/;}' file
some
thing
DOWN
<DOWN>
other

如何运作

  • /^$/

    这会查找空行。后面的括号中的命令仅在空行上执行。

  • {N; s/\nDOWN/<DOWN>/;}

    N命令读取模式空间中的下一行,用换行符分隔当前行。

    如果模式空间与空行后跟DOWN匹配,则替换命令s/\nDOWN/<DOWN>/将删除换行符,并将DOWN替换为<DOWN>

特例:DOS / Windows文件

如果文件具有DOS / Windows行结尾\r\n,则sed将仅在读入行时删除\n\r将保留。处理这些文件时,如果出现意外,该字符的存在可能会导致令人惊讶的结果。