在 tcsh 别名中使用 sed 时出错

在 tcsh 别名中使用 sed 时出错

我无法“获取/运行”我的tcsh别名,如下所示:

alias inp1 "grep -i "final_model" /scr/cb2TempProd/tmp/$USER/\!:1/Simulation/Input/assemble.preprocessing | sed 's#.*<##; s/>$//'"
  • 其中\!:1= 手动输入

  • 期望输出=/scr/cb2TempProd/tmp/$USER/test/Simulation/Input/X1_X_XXXX_XXXXXX15X_H10EK011.inp

  • 我将在所需输出 = 上使用附加别名(预定义)

    alias inp2 "gdyn `grep -i "final_model" /scr/cb2TempProd/tmp/$USER/\!:1/Simulation/Input/assemble.preprocessing | sed 's#.*<##; s/>$//'`"
    

  • 第一个问题 = 解决不兼容的变量错误(同时获取别名文件)
  • 第二个问题 = 我可以在单个别名中拥有两个输出吗

答案1

csh,变量替换总是出现在双引号内,并且不能被反斜杠阻止:

% echo "$"
Illegal variable name.
% echo "\$"
Variable name must contain alphanumeric characters.
% echo "\\$"
Variable name must contain alphanumeric characters.
% echo \$
$

这与 bourne shell 不同,并且记录在联机帮助页[1]:

在输入行被别名和解析之后,在执行每个命令之前,将执行变量替换,以$字符为键。可以通过在前面加上$except 来\防止 这种扩展双引号 ( ") 内,它总是出现的地方,并在单引号 ( ') 内,它永远不会出现。由反引号 ( ) 引用的字符串` `稍后会解释(请参阅下面的命令替换),因此$直到稍后(如果有的话)才会发生替换。如果A$后跟空格、制表符或行尾,则原样传递。

别名的最简单方法可能是在 之前/之后开始/停止双引号\$

alias inp1 "grep -i 'final_model' /scr/cb2TempProd/tmp/$USER/\!:1/Simulation/Input/assemble.preprocessing | sed 's#.*<##; s/>"\$"//'"

对于您的第二个别名,我认为您应该简单地重复使用inp1而不是尝试将其粘贴到:

alias inp2 'gdyn `inp1 \!:1`'

[1] 这是 的联机帮助页csh,但引用和替换在 中绝对相似tcsh

相关内容