Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何查找名称中包含换行符的文件_Regex_Linux_Bash_Find_Gnu Findutils - Fatal编程技术网

Regex 如何查找名称中包含换行符的文件

Regex 如何查找名称中包含换行符的文件,regex,linux,bash,find,gnu-findutils,Regex,Linux,Bash,Find,Gnu Findutils,关于文件名的正确处理,人们已经讲了很多。我认为使用设置为换行符的IFS通常可以解决这个问题,但显然,如果一个人的名字中有换行符的话,情况就不同了。因此,作为一种防御手段,脚本可以首先检查子树是否至少有一个带有换行符的文件,然后使用消息停止,以首先修复名称。 令人惊讶的是,我无法使查找与-regex匹配。唯一成功的方法是一个相当丑陋的 find . -name "*"$'\n'"*" 但例如find-正则表达式“*\n.*”不起作用。Emacs正则表达式应该允许像\n这样的转义字符,不是吗?有趣

关于文件名的正确处理,人们已经讲了很多。我认为使用设置为换行符的IFS通常可以解决这个问题,但显然,如果一个人的名字中有换行符的话,情况就不同了。因此,作为一种防御手段,脚本可以首先检查子树是否至少有一个带有换行符的文件,然后使用消息停止,以首先修复名称。 令人惊讶的是,我无法使
查找
-regex
匹配。唯一成功的方法是一个相当丑陋的

find . -name "*"$'\n'"*"
但例如
find-正则表达式“*\n.*”
不起作用。Emacs正则表达式应该允许像\n这样的转义字符,不是吗?有趣的是,它匹配另一个名称中带有字符
n
的文件。对不同的-regextype进行了实验,结果发现类型
awk
sed
posix extended
和一些其他类型会将文件与换行符匹配(比如
a\nxxx
),但除此之外,它们还会将文件与字符
n
匹配。奇怪的
另一方面,GNUFind文档并没有告诉任何关于转义字符支持的信息,比如
\n
。它们是否真的不受支持,因此我们无法在find regexps中使用
\t\n\r\a
和类似功能?

要查找所有包含新行的文件和目录,可以使用此POSIX兼容调用
find

find . -name '*
*'
其中文字换行符嵌入在单引号中
bash
支持其他语法来指定换行符:

find . -name \*$'\n'\*
或者说不那么笨拙:

EOL=$'\n'
find . -name "*$EOL*"
或者使用
-regex

find . -regex ".*$EOL.*"

事实上,这是可行的。但是类似的find-regex测试可能吗?到目前为止似乎不是这样,但还是要谢谢你。+1我添加了一个与POSIX兼容的版本,因为它似乎不值得为如此微小的差异添加一个竞争性的答案。@chepner:非常感谢我的朋友:)