【问题标题】:TCSH alias for previous command string substitution先前命令字符串替换的 TCSH 别名
【发布时间】:2021-07-27 20:58:50
【问题描述】:

我想创建一个别名,用 TCSH 中的新字符串替换上一个命令中所有出现的旧字符串。我知道我可以使用!!:gas/old/new 来做到这一点,但我希望它具有别名,因此我可以在命令行上使用sub old new 格式。我尝试了几种不同的字符转义方法,甚至无法让硬编码的子工作(例如alias sub \!\!:gas/old/new)它只返回Modifier failed.,我看不出如何使用它来调试问题。它应该是可能的还是有原因它不能工作?有没有可以做同样事情的替代工具?如果我可以在不是最新的先前命令上使用它,那将是一个奖励。

•   :g: global (apply once for each ‘word’)
•   :a: all (apply as many times as possible for a ‘word’)
•   :s: substitute

【问题讨论】:

    标签: alias tcsh


    【解决方案1】:

    在别名定义中,! 实际上是指调用别名时的参数。冒号修饰符用于选择一个或多个参数

    > alias name_age "echo \!:1 is \!:2 years old"
    > name_age Clark 80
       -->  Clark is 80 years old.
    

    要访问上一个命令行,然后将!修改为!-1!-1:* 提供所有参数,但不提供命令名称本身。 !-1:0* 将是命令加上所有参数。

    重复上一条命令的别名:

    > alias repeat "\!-1:0*"
    > echo one two three
    > repeat
       --> one two three
    

    在前面的命令中替换硬编码单词的别名:

    > alias repeat_one_ten "\!-1:0*:s/one/ten/"
    > echo one two three
    > repeat_one_ten
       --> ten two three
    

    不过,再往前走一步就会变得一团糟,因为您想将别名参数传递给修饰符规则。

    解决方案!!使用 ^old^new !

    tcsh 已经构建了一个快捷方式来重复上一个命令,将“旧”替换为“新”。

    > echo one two three
    > ^one^ten
    --->  ten two three
    

    【讨论】:

    • 很好的答案! ^one^ten 不会让我搜索替换多个实例,例如 !!:gas/one/ten 会。真的没有办法让你的 :s 例子更进一步吗?我有几个使用命令行参数的别名
    • 我没有意识到 ^old^new 仅限于“旧”的第一次出现。我不能说没有办法像你想要的那样制作别名......但我认为这不太可能。
    猜你喜欢
    • 2020-06-24
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2021-06-19
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多