在 $'...' 引用的字符串中扩展变量

Expanding a variable in a $'...'-quoted string

我试图在特定行之后立即追加行

echo $'oSAMPLEINSERT\E:x\n' |vi +/"$search_string" config.txt 

我可以使用变量(例如 $SampleIns)而不是对字符串进行硬编码 "SAMPLEINSERT"。有人可以帮忙吗

您可以更改字符串中间的引用上下文。 (您的代码实际上已经在执行此操作:+/"$search_string" 在未引用的上下文中扩展 +/ 部分,在双引号的上下文中扩展 $search_string

将包含变量的部分放在双引号内,需要C风格反斜杠转义处理的部分放在$''内,如下:

echo "o${SampleIns}"$'\E:x\n'

如果 SampleIns 包含反斜杠序列,请将它们替换为事先使用 printf %b 引用的文字值:

printf -v SampleInsLiteral '%b' "$SampleIns"
echo "o${SampleInsLiteral}"$'\E:x\n'

ed 可能更适合这样的工作。唯一的假设是 $searchstring 不包含未转义的 /.

# Make sure the search value is quoted for ed.
# That means verifying that ORACLE_HOME is similarly
# escaped. E.g. ORACLE_HOME='\/usr\/foo\/bar'
searchstring="LoadModule rewrite_module \"${ORACLE_HOME}\/ohs\/modules\/mod_rewrite.so\""
ed config.txt <<EOF
/$searchstring/a
SAMPLEINSERT
.
w
EOF