7

man bash描述了一个非常有用的事件指示符

^串1^串2^

快速替换。重复上一个命令,将 string1 替换为 string2。等价于 ''!!:s/string1/string2/''

有没有办法在命令行!!:gs/string1/string2/输入时执行@string1@string2@替换上一个命令中的所有匹配项?(@或任何其他指定的字符/字符串)

4

2 回答 2

11

^string1^string2^:g&

请参阅问题替换最后一个命令中出现的所有单词

请参阅历史扩展中的修饰符

于 2015-12-10T16:23:38.917 回答
1

很快:不!

其实可能存在一种方式,使用`trap "..." debug'...

就像是:

trap 'if [[ $BASH_COMMAND =~ ^@(.*)@(.*)@$ ]] ;then
     BASH_LAST=${BASH_LAST//${BASH_REMATCH[1]}/${BASH_REMATCH[2]}};
     $BASH_LAST;
     unset BASH_COMMAND;
   else BASH_LAST=$BASH_COMMAND;
   fi;
 ' debug

这又快又脏,留下了执行错误,但我认为:这可能是一种方法。

编辑 01

这有点好,但历史仍然很错误:

shopt -s extdebug
trap '
    if [[ $BASH_COMMAND =~ ^@(.*)@(.*)@$ ]] ;then
        BASH_LAST="${BASH_LAST//${BASH_REMATCH[1]}/${BASH_REMATCH[2]}}"
        $BASH_LAST
        false
      else
        BASH_LAST="$BASH_COMMAND"
      fi' debug

但是警告:我这样做是为了好玩,为了玩并了解它是如何工作的……这不是为了在有效的最终解决方案中使用!!

于 2013-04-29T17:28:36.787 回答