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
将保留。在处理这些文件时,如果未预料到该字符的存在,可能会导致意外结果。
在终端中,我正在尝试清理一些 .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
将保留。在处理这些文件时,如果未预料到该字符的存在,可能会导致意外结果。