2

我正在尝试从 bash 脚本中删除 case 子句。该子句会有所不同,但始终将反斜杠作为大小写匹配字符串的一部分。

我正在尝试 sed 但可以在 bash 脚本中使用 awk 或 perl one-liner。

编辑的目标很简单,类似于:

 $cat t.sh
 case N in 
 a\.b); 
   #[..etc., varies] 
 ;;
 esac

我正在与转义反斜杠、分号或两者的变量扩展发生冲突。如果我“评估”,我会去掉我的反斜杠转义符。如果我不这样做,分号就会赶上我。所以我尝试在 sed 中进行 subshel​​l 扩展。正如我所写的那样,这会使解释器犯规。更多地转义分号似乎无济于事。

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
4

2 回答 2

0
X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh

这是用 shell 引用玩游戏,但效果很好。:)

于 2010-06-09T20:44:58.723 回答
0

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请注意在命令参数周围使用双引号。单引号将防止变量的扩展和命令替换。但是,当不使用这些时,通常最好使用单引号。

于 2010-06-10T02:24:33.673 回答