在 Sed 命令中将行尾与 $ 匹配时出错

在 Sed 命令中将行尾与 $ 匹配时出错

csh我目前正在通过 shell 脚本应用以下命令。

sed -i "s/cb $i$/cb $i $cb/" */callback_events

在哪里:

  • $i- 变量的值i
  • $cb- 变量 cb 的值
  • $- 匹配行尾

但是,使用上述命令时出现以下错误。

Variable name must contain alphanumeric characters.

我当前的 shell 是/bin/csh

答案1

当字符$要在双引号中的字符串中代表其自身时,您必须对其进行转义;否则,shell 会认为它引入了变量扩展,并且如果其后的字符不是字母或特殊变量之一,shell 会不高兴。

sed -i "s/cb $i"\$"/cb $i $cb/" */callback_events

这里有两个层次的人物解读。

  1. 首先,shell 读取命令并应用其规则。其中一条规则是双引号内$引入变量扩展。

  2. shell 执行完命令后如下:

     sed -i s/cb <value-of-i>$/cb <value-of-i> <value-of-cb/ dir1/callback_events dir2/callback_events...
    

    请注意,引号消失了,$i取而代之$cb的是它们的值,\$变成了$。还被*/callback_events替换为文件列表。

  3. 然后将其传递给sed,适用于它是规则。其中一条规则是,$搜索模式末尾的 表示行尾。

答案2

在 Ubuntu Studio 18 上,$错误是由于bash 扩展$0运行vs时注意错误$(0)vs$0

在脚本中查找行尾的另一种方法sed找到所有内容并使用&变量在其后附加内容;用法如下:

$ echo "this was here" | sed -e 's_.*_& YOURFOOBAR_'

如果你正在学习sed脚本,你可以使用 home 键之类的键来查找前面的内容,^并添加带有字符sed的多个命令。在这里,我交替使用或来替换脚本命令;_/sed's///'

$ echo "this was here" | sed -e 's/^/PREFIXEDTEXT /;s_.*_& SUFFIXEDTEXT_'

笔记: 测试命令的别名像这样,所以别名[=test所以我认为这会导致 bash 扩展出现问题。请参阅 man bash 之类的东西&|不起作用。

最后,我建议从 ebay 上买一本书而不是尝试在这里学习。

答案3

使用 sed 复制所有内容并粘贴并在末尾插入字符,效率不高,但有效

alias insert_single_quote_at_end ' echo hi | sed "s/.*/&'\''/" '

输出:

hi'

答案4

我也遇到了麻烦,实现这一目标的最简单的方法是使用sed -n l

sed -i "s/cb `echo $i | sed -n l`/cb $i $cb/" */callback_events

相关内容