在sed正则表达式的bash扩展::移除的情况下子句X = 'A \ .B'; Y = ';;' SED -n '/ $ {X} /,/ $ {Y} / d'

StackOverflow https://stackoverflow.com/questions/3009202

我想从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引用游戏,但它工作得很好。 :)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top