在sed正则表达式的bash扩展::移除的情况下子句X = 'A \ .B'; Y = ';;' SED -n '/ $ {X} /,/ $ {Y} / d'
-
26-09-2019 - |
题
我想从bash脚本删除的情况下子句。该条会有所不同,但总是有反斜杠视情况匹配的字符串的一部分。
我试图sed的但可以在bash脚本中使用AWK或Perl的单行。
编辑的目标是直接的,酷似:
$cat t.sh
case N in
a\.b);
#[..etc., varies]
;;
esac
我运行触犯变量扩展的逸出反斜杠,分号或两者。如果我“EVAL”我剥我的反斜杠。如果我不这样做,分号赶上我了。所以,我想内的sed子shell扩展。这个犯规,因为我已经写了它的解释。更逃避分号似乎并没有帮助。
X='a\.b' ; Y=';;'
sed -i '/$(echo ${X} | sed -n 's/\\/\\\\/g')/,/$(echo ${Y} | sed -n s/\;/\\;/g')/d t.sh
和这样的:
perl -i.bak -ne 'print unless /${X}/ .. /{$Y}/' t.sh # which empties t.sh
和
eval perl -i.bak -ne \'print unless /${X}/ .. /{$Y}/' t.sh # which does nothing
解决方案
bash的printf
具有引用功能,可以帮助:
X='a\.b'; Y=';;'
sed "/$(printf "%q" "$X")/,/$(printf "%q" "$Y")/d" t.sh
,也可以另外使用printf
变量赋值特征:
printf -v X "%q" 'a\.b'
printf -v Y "%q" ';;'
sed "/$X/,/$Y/d" t.sh
请注意使用围绕sed
命令参数双引号。单引号将防止变量和命令替换扩张。那些没有被使用时,虽然,通常最好使用单引号。
其他提示
X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh
这是玩shell引用游戏,但它工作得很好。 :)
不隶属于 StackOverflow