Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Bash 如何使用文字反斜杠和撇号grep文件名_Bash_Grep_Escaping_Backslash_Apostrophe - Fatal编程技术网

Bash 如何使用文字反斜杠和撇号grep文件名

Bash 如何使用文字反斜杠和撇号grep文件名,bash,grep,escaping,backslash,apostrophe,Bash,Grep,Escaping,Backslash,Apostrophe,我有一个脚本,在这个脚本中,我试图grep一个日志文件,以查找包含带撇号的文件名的行,这些文件名已用反斜杠转义 我的grep代码是: grep -i saved logfile | grep "/path/to/file/filename contains spaces, apostrophe\'s, and commas" 日志文件中的撇号前面都有反斜杠,因此以下grep命令有效: grep -i saved logfile | grep "/path/to/file/filename co

我有一个脚本,在这个脚本中,我试图grep一个日志文件,以查找包含带撇号的文件名的行,这些文件名已用反斜杠转义

我的grep代码是:

grep -i saved logfile | grep "/path/to/file/filename contains spaces, apostrophe\'s, and commas"
日志文件中的撇号前面都有反斜杠,因此以下grep命令有效:

grep -i saved logfile | grep "/path/to/file/filename contains spaces, apostrophe\\\'s, and commas"
但是,我尝试在文件名为变量的if语句中运行此命令:

if [[ ! $(grep -i saved logfile | grep "$i") ]]
它不会返回匹配项

我如何避开反斜杠和撇号来与grep匹配?

grep'ing for“\\\”对我来说很有用:

root@ultra:~# a="\\\'"
root@ultra:~# echo -e marley\\\'s\ ghost\\nmarley\'s ghost
marley\'s ghost
marley's ghost
root@ultra:~# echo -e marley\\\'s\ ghost\\nmarley\'s ghost | grep $a
marley\'s ghost
root@ultra:~# 

这里有多个层。反斜杠对于
grep
和双引号字符串中的shell都有特殊含义。如果将正则表达式放在单引号中,事情会更简单,但是,当然,正则表达式不能包含单引号。但是您可以在单引号字符串旁边的双引号中使用单引号

grep -i saved logfile |
grep '/path/to/file/filename contains spaces, apostrophe\\'"'"'s, and commas'
第一个单引号字符串以
撇号\\\'
结尾,然后是
“'”
——一个包含单引号的双引号字符串。然后是另一个单引号字符串

grep -i saved logfile |
grep '/path/to/file/filename contains spaces, apostrophe\\'"'"'s, and commas'
或者,添加足够的反斜杠以满足shell和
grep

grep -i saved logfile |
grep "/path/to/file/filename contains spaces, apostrophe\\\'s, and commas"
当然,另一种选择是使用
grep-F
,它将匹配整个字符串作为一个文本,即点将只匹配点,而不是任何字符,星号将只匹配星号,而不是前一个字符的重复,等等


(不过,“撇号”的正确复数形式只是“撇号”。

变量的值是如何分配的?变量到底包含什么?算出了!grep-我保存了日志文件| grep$(echo$i | sed's/\\/\\\\\\\/g)。变量是从日志文件中灰色化的文件名。日志文件中的所有文件名的撇号都已转义,但使用sed来转义反斜杠和撇号似乎有效。您的非引号
echo$i
增加了新的麻烦。不管怎么说,你最好换个外壳
grep-我保存了日志文件| grep“${i/\\\/\\\\\\\}”
,但即使输入为“marley's ghost”且没有反斜杠,它也会返回匹配项。OP只想与反斜杠匹配。