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
这里有两个层次的人物解读。
首先,shell 读取命令并应用其规则。其中一条规则是双引号内
$
引入变量扩展。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
替换为文件列表。然后将其传递给
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