Linux从文件中取出字符串并将其用作文件名?

时间:2013-12-11 17:25:33

标签: linux bash shell sed

我正在写脚本并且在某些时候陷入困境。

文件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`

1 个答案:

答案 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