删除 case 子句: sed 正则表达式中的 bash 扩展: X='a\.b' ; Y=';;' sed -n '/${X}/,/${Y}/d'

发布于 2024-09-05 17:59:11 字数 718 浏览 4 评论 0原文

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

我正在尝试 sed,但可以在 bash 脚本中使用 awk 或 perl 单行代码。

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

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

我与转义反斜杠、分号或两者的变量扩展发生冲突。如果我“评估”,我会去掉反斜杠转义符。如果我不这样做,分号就会追上我。所以我尝试了 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

I'm trying to remove a case clause from a bash script. The clause will vary, but will always have backslashes as part of the case-match string.

I was trying sed but could use awk or a perl one-liner within the bash script.

The target of the edit is straightforward, resembles:

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

I am running afoul of the variable expansion escaping backslashes, semicolons or both. If I 'eval' I strip my backslash escapes. If I don't, the semi-colons catch me up. So I tried subshell expansion within the sed. This fouls the interpreter as I've written it. More escaping the semi-colons doesn't seem to help.

X='a\.b' ; Y=';;'   
sed -i '/$(echo ${X} | sed -n 's/\\/\\\\/g')/,/$(echo ${Y} | sed -n s/\;/\\;/g')/d t.sh

And this:

perl -i.bak -ne 'print unless /${X}/ .. /{$Y}/' t.sh  # which empties t.sh

and

eval perl -i.bak -ne \'print unless /${X}/ .. /{$Y}/' t.sh  # which does nothing

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扭转时空 2024-09-12 17:59:11

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

Bash's printf has a quoting feature that will help:

X='a\.b'; Y=';;'
sed "/$(printf "%q" "$X")/,/$(printf "%q" "$Y")/d" t.sh

or you can additionally use the printf variable assignment feature:

printf -v X "%q" 'a\.b'
printf -v Y "%q" ';;'
sed "/$X/,/$Y/d" t.sh

Note the use of double quotes around the sed command argument. Single quotes will prevent the expansion of variables and command substitution. When those aren't being used, though, it's usually best to use single quotes.

不必了 2024-09-12 17:59:11
X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh

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

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

This is playing games with shell quoting, but it works pretty well. :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文