替换之前Bash命令中的所有字符串的快捷方式

7

man bash 描述了一个非常有用的事件设计符

^string1^string2^

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

在命令行中输入 @string1@string2@@ 或其他指定字符/字符串),是否有一种方法执行 !!:gs/string1/string2/ 以替换前一个命令中的所有出现?


你为什么想要这样做呢?打一个 ^ 也不难啊... - Fredrik Pihl
@FredrikPihl ^from^to^ 只会替换第一次出现的,我正在寻找一种快捷方式来替换所有出现的。 - Alex
2个回答

11

^string1^string2^:g&

请参考这个问题,用新字符串`string2`替换上一个命令中的所有旧字符串`string1`。

请在历史扩展中查看修饰符


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

但是请注意:我这么做只是为了娱乐,为了和一起玩耍并理解它的工作原理... 这不是为了用于有效的最终解决方案!!


你能详细说明一下你的代码示例吗?我使用 bash -c "$BASH_LAST" 执行成功了,但它在修改后的命令输出之后坚持要打印 @foo@bar@: command not found - Alex
@Alex 编辑过了... 这个工作更好了,但还有很多需要解决的问题... 如果你觉得有用的话,随意编辑我的答案来添加一些解释;-) - techno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接