【问题标题】:Using a variable with a dollar sign in it in bash在 bash 中使用带有美元符号的变量
【发布时间】:2013-04-01 00:19:53
【问题描述】:

我有一个变量,其中包含一个带有 $ 美元符号的字符串,我想使用 sed 来修改一个文本文件。每当变量中有美元符号时,我都会收到一个错误,但是当没有美元符号时它可以正常工作。我怎样才能解决这个问题?我在一个双引号中使用多个变量和文字。

代码:

sudo sed -i "textFile.txt" -e "s,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g" textfile.txt

【问题讨论】:

  • 向我们展示导致问题的代码。
  • 您确定是美元符号引起了麻烦吗?它也包含逗号吗?您可以通过包含$var1$var2WithDollarSign$var3 的示例值来帮助我们帮助您,还可以包含您从...得到的确切错误消息......是sed 还是抱怨的shell?我们会知道您是否提供了确切的错误消息。
  • 没有逗号但是有/的
  • 变量是随机数据(复制一个加密字符串),错误是sed: -e expression #1, char 122: undetermined `s' command
  • 我基本上需要复制 var2,修改 var1 和 var3,然后用修改后的 var1 和 var3 将其写回,同时保持 var2 完整,包括美元符号和 \'s

标签: string bash variables sed


【解决方案1】:

我认为您的问题是您正在运行 sudo 来运行 sed 命令:

sudo sed -i "textFile.txt" -e "s,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g" textfile.txt

问题在于,您使用的 shell 会处理一次参数,然后 sudo 代表您运行的 shell 会再次处理参数。我建议创建一个包含sed 命令并设置shell 变量的shell 脚本,然后从sudo 运行它。

cat > script <<!
sed -i "textFile.txt" -e 's,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g' textfile.txt
!
sudo sh -x script
rm -f script

这样会节省很多脑力。

示例

$ cat xx.sh
var1='theperson'
var2WithDollarSign='the$voodoo$wizard'
var3='Albuquerque'
cat > script <<!
sed -i "textFile.txt" -e 's,\($var1\):\(.*:\):,\1:$var2WithDollarSign:$var3,g' textfile.txt
!
cat script
rm -f script
$ sh xx.sh
sed -i "textFile.txt" -e 's,\(theperson\):\(.*:\):,\1:the$voodoo$wizard:Albuquerque,g' textfile.txt
$

我已将 su sh -x script 替换为 cat script。你会撤消那个替换。 -x 是可选的;它只是向您显示脚本正在执行的内容。

【讨论】:

  • 这看起来很棒,但我不明白,可能无法使其正常工作......我在第 4 周参加 Linux 上的 uni 课程,手头经验为 0 对不起,他们'可以这么说,真的让我们陷入了困境
  • @StevenCragg:那你为什么要以super user 的身份运行脚本呢?
  • 我需要 sudo 来访问这个问题中的文本文件,并且没有 su 可以使用,也没有 root 帐户
  • 在系统中。行政。 uni 的课程在 passwd 和 shadow 文件中处理用户数据的脚本,并说我们可以使用 sudo,但不能使用 root 帐户或 su。我看不出 su 和 sudo 之间的区别,但我相信我会在课程的后面。
  • 除非您知道它可以精确且正确地工作,否则请不要以 root 身份执行任何操作。太他妈危险了使用 root 权限试验脚本是个坏主意。
【解决方案2】:

您必须反斜杠特殊字符。切换到更强大的工具可能会更容易,例如Perl,它已经具有执行此操作的功能(quotemetas/\Q$var\E/.../)。

【讨论】:

  • 我是 Bash 新手,甚至还没有考虑过 Perl。我基本上是在获得有关大学作业问题的帮助
  • @StevenCragg:然后在 sed 中每个具有特殊含义的字符之前添加 \。例如:x='Price $20'; x=${x//$/\\$}.
  • 这是否适用于可能是 jhg78g$buih789$.khbyi7vuy/nij 并且没有固定数量的美元符号的变量?
  • @Steven: TITS or Try It To See :-) 请注意. 在正则表达式模式中也很特殊。
  • 所以我应该做两次以上?一次是 $,一次是 .?
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 2012-07-31
  • 1970-01-01
  • 2012-09-05
  • 2011-03-29
相关资源
最近更新 更多