Regex 在ssh中使用通配符和引号

Regex 在ssh中使用通配符和引号,regex,bash,quotation-marks,Regex,Bash,Quotation Marks,我有一个文件,我想用“”、“11月30日”、“代码>或“11月30日”< /代码>字符串(基本上我不想指定中间的空格数)。 在终点站,这很好,我只需要做: grep 'Nov * 30' file 但是,出于我的目的,最好保持它的通用性,所以事实上我想做一些事情,比如: grep "$(date +%b) * $(date +%d)" file 这很好,但实际上我想通过ssh来实现这一点 ssh -t host "grep "$(date +%b) * $(date +%d)" file"

我有一个文件,我想用“<代码>”、“11月30日”、“代码>或<代码>“11月30日”< /代码>字符串(基本上我不想指定中间的空格数)。

在终点站,这很好,我只需要做:

grep 'Nov * 30' file
但是,出于我的目的,最好保持它的通用性,所以事实上我想做一些事情,比如:

grep "$(date +%b) * $(date +%d)" file
这很好,但实际上我想通过ssh来实现这一点

ssh -t host "grep "$(date +%b) * $(date +%d)" file"
在这一点上,我遇到了一些问题。它不是只对Nov 30类型的日期字符串进行grepping,而是返回各种不同的11月日期。我觉得这个问题与双引号的使用有关(也许-t参数的第一组双引号影响了第二组,但我不知道如何绕过它),我从答案中看到“bash将在本地机器上计算并替换双引号内的变量,但在目标机器上使用单引号内的变量”

ssh -t host "grep '$(date +%b) * $(date +%d)' file"
但是现在grep根本不返回任何结果!我假设这是因为我正在为文字“$(date+%b)…”而不是替换的“Nov…”进行grep,但是我不明白为什么第一次使用双引号的尝试不起作用

欢迎任何帮助

转义您的报价:

ssh -t host "grep \"$(date +%b) * $(date +%d)\" file"
逃避你的引用:

ssh -t host "grep \"$(date +%b) * $(date +%d)\" file"

或者,单引号表示希望在远程计算机上执行的命令行。(在这种情况下,
date
命令将在远程端执行。)


或者,单引号表示希望在远程计算机上执行的命令行。(在这种情况下,
date
命令将在远程端执行。)


在此版本中,
date
命令将在本地执行:

ssh -t host "grep '$(date +%b) * $(date +%d)' file"

在此版本中,将在远程主机上执行
date
命令:

ssh -t host 'grep "$(date +%b) * $(date +%d)" file'
当您的本地PC和服务器位于不同的时区时,这可能会产生影响。例如,现在法国是12月1日,而我的服务器在美国是11月30日

在第1个版本中,双引号中的
$()
在发送到服务器之前进行评估。因此发送到服务器的命令是
grep'Dec*1'文件,位于我的时区中


在第二个版本中,单引号中的
$()
在发送到服务器之前不会进行计算。因此发送到服务器的命令是
grep“$(日期+%b)*$(日期+%d)”文件
,因此服务器将计算
$()
双引号内。

在此版本中,
日期
命令将在本地执行:

ssh -t host "grep '$(date +%b) * $(date +%d)' file"

在此版本中,将在远程主机上执行
date
命令:

ssh -t host 'grep "$(date +%b) * $(date +%d)" file'
当您的本地PC和服务器位于不同的时区时,这可能会产生影响。例如,现在法国是12月1日,而我的服务器在美国是11月30日

在第1个版本中,双引号中的
$()
在发送到服务器之前进行评估。因此发送到服务器的命令是
grep'Dec*1'文件,位于我的时区中

在第二个版本中,单引号内的
$()
在发送到服务器之前不会进行计算。因此,发送到服务器的命令是
grep“$(日期+%b)*$(日期+%d)”文件
,因此服务器将在双引号内计算
$()