man bash
描述了一个非常有用的事件设计符
^string1^string2^
快速替换。重复上一个命令,将 string1 替换为 string2。等同于 ''!!:s/string1/string2/''
在命令行中输入 @string1@string2@
(@
或其他指定字符/字符串),是否有一种方法执行 !!:gs/string1/string2/
以替换前一个命令中的所有出现?
man bash
描述了一个非常有用的事件设计符
^string1^string2^
快速替换。重复上一个命令,将 string1 替换为 string2。等同于 ''!!:s/string1/string2/''
在命令行中输入 @string1@string2@
(@
或其他指定字符/字符串),是否有一种方法执行 !!:gs/string1/string2/
以替换前一个命令中的所有出现?
实际上,可能存在一种方法,使用`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一起玩耍并理解它的工作原理... 这不是为了用于有效的最终解决方案!!
bash -c "$BASH_LAST"
执行成功了,但它在修改后的命令输出之后坚持要打印 @foo@bar@: command not found
。 - Alex
^
也不难啊... - Fredrik Pihl^from^to^
只会替换第一次出现的,我正在寻找一种快捷方式来替换所有出现的。 - Alex