在 sed 中使用变量 (UNIX)

Using variables with sed (UNIX)

我正在尝试读取日志文件并创建一个新文件,其中仅包含给定日期和时间之后的条目。例如,我只在下面的日志中 07:00:00.000 之后寻找:

2015-01-16 00:00:00.001 DATA
2015-01-16 07:05:00.121 DATA
2015-01-16 07:10:15:543 DATA

会去:

2015-01-16 07:05:00.121 DATA
2015-01-16 07:10:15:543 DATA

我已经可以使用它了:

sed -n '/^2015-01-16 07/,$p' oglog.log > newlog.log

但是当我尝试通过变量添加日期时:

date=$(date -d -1hour +'%Y-%m-%d %H')

我无法让它工作。我知道您需要通过双引号或单引号 (https://askubuntu.com/questions/76808/how-to-use-variables-in-sed-command) 获取 shell 来扩展变量,但是使用这两种方法中的任何一种都会导致 $p 的替换部分出现问题命令。如何获得 shell 扩展一个变量而不扩展另一个变量并使用类似于下面的命令?

sed -n '/^$date/,$p' oglog.log > newlog.log
sed -n "/^$date/"',$p' oglog.log > newlog.log

您希望 $date 由 shell 扩展,因此需要用双引号引起来。您不希望 $p 被 shell 扩展,因此需要用单引号引起来。您也可以使用反斜杠来防止 shell 扩展 $p,但如果您在正则表达式中有其他有意义的反斜杠,那很快就会变得令人讨厌:

sed -n "/^$date/,$p" oglog.log > newlog.log

使用

sed -n "/^$date/,$p" oglog.log > newlog.log

变量没有用单引号展开。

"Double quote" 每个包含 spaces/metacharacters 和 每个 扩展的文字:"$var""$(command "$var")""${array[@]}" , "a & b"。使用 'single quotes' 作为代码或文字 $'s: 'Costs US'ssh host 'echo "$HOSTNAME"'。参见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words