【问题标题】:Handle bash variable that may include dollar sign?处理可能包含美元符号的 bash 变量?
【发布时间】:2015-02-18 18:14:50
【问题描述】:

我有一个脚本,它接受可能包含特殊字符的用户输入。我通过 sed 配方运行该变量,该配方将查找和转义特殊字符,但如果变量包含“$”,则输出将被截断。如何自动转义变量中可能出现的任何美元符号?还是我只需要回显一条消息,“如果有美元符号,您必须在其前面加上反斜杠”?

【问题讨论】:

  • 您的脚本如何获得用户输入?
  • 请显示足够的代码来重现您遇到的问题,包括您如何获取输入以及您希望如何使用转义字符串。
  • 您的方法不对,因为您通常不能使用 sed 脚本来转义“特殊字符”,因为“特殊”字符的含义是上下文相关的,您需要留出至少 1" sed 的特殊“字符用作分隔符。发布一些示例输入和预期输出,我们可以为您提供帮助。

标签: bash variables sed character


【解决方案1】:

示例文件:

$ cat file.txt
Foo
teste $var lorem ipsum
$foo bar $z
Bar

脚本:

#!/usr/bin/env bash
read -p 'Type search pattern: ' pattern
sed -n '/'"${pattern}"'/ p' < file.txt

现在如果你做chmod u+x script 然后:

$ ./script
Type search pattern: $var
teste $var lorem ipsum

虽然非常简单,但它确实有效。你引用的东西正确吗?

【讨论】:

  • a/b的用户输入试试,你会得到一个神秘的错误信息,比如sed: can't find label for jump to /'`。 sed 根本无法做到这一点。
  • 如果我这样做 sed -n '\:'"${pattern}"': p' &lt; file.txt 它似乎在 GNU Sed 4.2.2 中工作。我试过的输入是a/b
  • 现在尝试使用用户输入a:b 的新sed 命令,您将得到sed: can't find label for jump to ':'。无限...问题是OP希望将输入视为字符串(即所有文字字符),但 sed 根本不支持字符串,无论您如何尝试找出需要转义的内容以使 sed 尝试不要将它正在处理的正则表达式视为正则表达式,总会有例外。只需使用 fgrep 或 awk 等具有字符串处理功能的工具即可。
  • @EdMorton,不过,这个问题似乎与美元符号有关。无论如何,似乎发帖的人甚至不再阅读这篇文章,他也没有发布一些示例代码或输入。不过,你是对的。无论使用什么分隔符,都可以打破它。
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 2011-04-24
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2012-09-05
  • 2011-11-16
相关资源
最近更新 更多