2016-04-26 159 views
2

我有以下内容的FILE1.TXT:双引号中使用双引号

time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F" 

我想要的文件,如下看:

9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F 

其实,我需要通过命令作为一个字符串。这就是为什么bash命令需要用双引号封装在一个字符串中。但是,当我包括

" grep -Po '(?<=Fingerprint=)[^"]*' " 

我没有得到所需的输出。看来,我需要正确地转义双引号。

+0

这可以说是重复http://stackoverflow.com/questions/2005192/how-to-execute-a-bash-command-stored-as-a-string-with-quotes-and-asterisk –

+0

.. .btw,bash和POSIX sh在一些非常相关的方面有所不同(Bourne shell的差异还有待进一步提高,但红帽有史以来没有出现过,所以你的标签不包括它)。在我的回答中,我只包含了一个仅适用于bash的部分,但如果您只是为其中的一个添加标签,则可以更清楚地了解这是否可以接受。 –

回答

5

要回答文字的问题,您可以使用反斜杠在您的命令中转义文字双引号。然而,对于BashFAQ #50给出的理由,这是实践非常差:

# Avoid this absent a very good reason 
grep_cmd_str="grep -Po '(?<=Fingerprint=)[^\"]*'" 
eval "$grep_cmd_str" <file1.txt # eval is necessary, with all the issues that implies 

当你需要存储一个简单的命令(不带重定向或其他外壳结构)在 [1]更好的做法变量是使用一个数组 [2],而不是一个标量,以保持它的参数:

# Use this principally if you need to dynamically build up an argument list 
grep_args=(grep -Po '(?<=Fingerprint=)[^"]*') 
"${grep_args[@]}" <file1.txt 

如果你没有任何constra要求您整数使用两种以上的,考虑功能(这确实允许重定向和外壳构造,只要他们硬编码):

# Use this whenever possible, in preference to the above 
grep_fp() { grep -Po '(?<=Fingerprint=)[^"]*' "[email protected]"; } 
grep_fp <file1.txt 

[1] - 未评估壳在这种情况下,构造是一种安全特性:它可以保护您免受恶意文件名或类似内容的影响,这些值已被替换为您用作命令的值。

[2] - 请注意,数组在POSIX sh中不可用,您的问题也被标记为可用。也就是说,类似的功能可以通过覆盖"[email protected]"(大概在一个有限的范围内,例如一个函数中,使得它的原始值被保存)而获得。