我正在写脚本并且在某些时候陷入困境。
文件1:此行位于其他文件
中#!/bin/sh
sh ~/.test/Folder-Name/.filetest &
文件2:在这个文件中,我想要grep 〜/ .test / Folder-Name / .filetest 这个文件的位置。 它包括连字符,点,削减。我用sed和grep尝试了许多正则表达式但不幸的是它对我不起作用。 例如
SelectedFile=`cat Anotherfile.txt | grep -Rril '~\/\.conky\/[A-Z-a-z]\/\.conkyrc' > ~/abc`
答案 0 :(得分:1)
你的正则表达式还不完整:
'~\/\.conky\/[A-Z-a-z]\/\.conkyrc'
^^^^^^^^^
在标记的位置,您要求使用单个字符。你想要的是很多这个角色:
'~\/\.conky\/[A-Z-a-z]*\/\.conkyrc'
^
添加了*
!
另请注意,您无需转义/
s:
'~/\.conky/[A-Z-a-z]*/\.conkyrc'
此外,根据可能的模式,您也可以使用匹配任何非空格字符而不仅仅是A-Z-a-z
:
'~/\.conky/[^ ]*/\.conkyrc'
请注意,您是以非常冗余和不正确的方式调用grep
。首先,而不是:
cat X | grep Y
你可以这样做:
grep Y X
第二,你给grep的一些选项是不必要的或错误的。例如-R
(和冗余-r
)表示递归搜索。但你不是在搜索目录!第二个-i
表示搜索不区分大小写,这可能是多余的,因为模式已经具有正确的大小写。第三,你给它-l
这意味着“给出具有模式的文件”,而不是“与模式匹配的行”。
关于后者,你可能真的想要文件名,没关系,但是你肯定不应该在grep
中管道文件,而是直接给它起名字,这样它才能知道它!
简而言之,试试这个:
grep -l '~/\.conky/[^ ]*/\.conkyrc' AnotherFile.txt
如果要将其写入另一个文件,请添加重定向:
grep ... > some_file
但是如果你想将输出保存在变量中,不重定向它,否则你将失去它!所以:
SelectedFile=$(grep -l '~/\.conky/[^ ]*/\.conkyrc' AnotherFile.txt)
顺便说一句,如果你打算搜索文件(不知道它在AnotherFile.txt
中,否则搜索相当愚蠢),你可以在目录上进行递归搜索:
grep -rl '~/\.conky/[^ ]*/\.conkyrc' SomeDirectory > ~/abc