如何在sed命令中正确实现命令替换与变量替换?
问题根因
你给出的两种写法都踩了shell引号解析和变量展开的坑:
- 第一种命令替换写法:双引号包裹的sed脚本里的
$p会被shell识别为变量p提前展开,你实际传给sed的命令里没有$p这个打印到最后一行的语法,自然没有输出。 - 第二种变量替换写法:用单引号包裹了整个sed脚本,单引号内的
${search}不会被shell解析替换,额外加的双引号还会让sed去匹配带双引号的日期字符串,匹配不到就没有输出。
正确写法
命令替换方案
给sed语法里的$加反斜杠转义,避免被shell提前解析:
sed -n "/$(date -d '1 year ago' '+%Y-%m')/,\$p" filename.csv
变量替换方案
两种可选写法:
- 写法1:把变量放在双引号区间内,其余部分用单引号包裹,不需要额外转义
$
search=$(date -d "1 year ago" '+%Y-%m') sed -ne '/'"${search}"'/,$p' filename.csv
- 写法2:整个sed脚本用双引号包裹,转义sed语法里的
$
search=$(date -d "1 year ago" '+%Y-%m') sed -ne "/${search}/,\$p" filename.csv
核心规则
- shell的命令替换、变量替换仅在双引号或无引号区域生效,单引号内的所有内容会原样传给sed
- 如果sed脚本放在双引号里,脚本中表示「最后一行」「行尾」语义的
$必须加反斜杠转义,避免被shell识别为变量引用 - 不要额外加多余的引号,除非你要匹配的文本本身就包含引号
内容的提问来源于stack exchange,提问作者usert4jju7
相关产品推荐
相关产品推荐

