【发布时间】:2010-06-10 10:24:33
【问题描述】:
我正在尝试从 bash 脚本中删除 case 子句。该子句会有所不同,但始终将反斜杠作为大小写匹配字符串的一部分。
我正在尝试 sed,但可以在 bash 脚本中使用 awk 或 perl 单行代码。
编辑的目标很简单,类似于:
$cat t.sh
case N in
a\.b);
#[..etc., varies]
;;
esac
我正在与转义反斜杠、分号或两者的变量扩展发生冲突。如果我“评估”,我会去掉我的反斜杠转义符。如果我不这样做,分号就会赶上我。所以我尝试在 sed 中进行 subshell 扩展。正如我所写的那样,这会使解释器犯规。更多地转义分号似乎没有帮助。
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
【问题讨论】:
-
你的转义斜线在我看来有点倒退(应该是`\`而不是
/)。在单引号字符串中,变量无论如何都不会插值,所以你有一些转义是多余的 -
呃。但这有效(抱歉没有漂亮的打印): $ echo ${X} | sed -e 's/\\/\\\\/g' ; # a\\.b ; $ sed -e '/a\\.b/,/\;\;/d' t.sh ; $cat t.sh ;案例 N 在 ; esac ;这是想要的效果。这个想法是以编程方式而不是像上面那样以交互方式将一个对 shell 友好的字符串放入 sed 中。这就是明显多余的转义符(即 \,“/”用于 sed 定界)出现的地方。
标签: perl bash sed variable-expansion