Sed on Mac 无法识别正则表达式

Sed on Mac not recognizing regular expressions

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

如果我尝试搜索并替换为文字字符串,它会起作用:

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

(从每个文本文件中删除单词 "Title Page")

但是,即使我尝试使用最基本的正则表达式,它也不起作用:

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

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

这不起作用。 "regular expression" 唯一的事情就是寻找换行符。

我一定是做错了什么。

非常感谢任何帮助。

更新:第 2 部分

John1024 的回答一方面对我帮助很大。

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

现在我无法让其他类型的正则表达式正确响应。上面的例子,我想删除所有出现在一行开头的数字。

啊!我错过了什么?

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

我看到您想查找后跟 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 命令将下一行读入模式 space,与当前行用换行符分隔。

    如果模式 space 匹配后跟 DOWN 的空行,替换命令 s/\nDOWN/<DOWN>/ 会删除换行符并将 DOWN 替换为 [=13] =].

特例:DOS/Windows 文件

如果文件有 DOS/Windows 行结尾,\r\n,sed 只会在读入该行时删除 \n\r 将保留。在处理这些文件时,如果未预料到该字符的存在,可能会导致意外结果。