在终端中,我正在尝试清理一些.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/;}' {} +;
现在我无法让其他类型的正则表达式正确响应。上面的示例,我希望删除出现在行首的所有数字。
哎呀!我错过了什么?
答案 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行结尾\r\n
,则sed将仅在读入行时删除\n
。\r
将保留。处理这些文件时,如果出现意外,该字符的存在可能会导致令人惊讶的结果。