如何在bash历史扩展中匹配行尾

如何在bash历史扩展中匹配行尾,bash,Bash,Bash为历史扩展提供了良好的支持,例如: echo onetwoone echo !$ => onetwoone 此外,我们还可以根据manbash使用替换: echo onetwoone echo !$:s/one/three/ => threetwoone 首先,我假设这是与sed类似的语法,但事实并非如此。我找不到匹配字符串后端的方法 echo onetwoone | sed 's/one$/three/' => onetwothree 我想对bash的历史扩展做

Bash为历史扩展提供了良好的支持,例如:

echo onetwoone
echo !$
=> onetwoone
此外,我们还可以根据
manbash
使用替换:

echo onetwoone
echo !$:s/one/three/
=> threetwoone
首先,我假设这是与
sed
类似的语法,但事实并非如此。我找不到匹配字符串后端的方法

echo onetwoone | sed 's/one$/three/'
=> onetwothree
我想对bash的历史扩展做同样的事情:

echo onetwoone
echo !$:s/one$/three/
=> -bash: :s/one$/three/: substitution failed

有没有办法做到这一点?谢谢

我不这么认为。引用手册()

s/旧/新/

将事件行中第一次出现的旧项替换为新项。任何分隔符都可以用来代替“/”。分隔符可以用旧的和新的格式引用,并带有一个反斜杠。如果“&”出现在“新”中,它将被“旧”替换。一个反斜杠将引用“&”。如果最后一个分隔符是输入行上的最后一个字符,则它是可选的

它没有说什么关于旧的是一个正则表达式或任何形式的模式

你可以做额外的工作:用“三”替换“一”,重复替换,然后用“一”替换第一个“三”

修饰符似乎不理解正则表达式

解决方法可能是使用
sed

$ echo onetwoone
onetwoone
$ sed 's/one$/three/' <<< $(echo !$)
sed 's/one$/three/' <<< $(echo onetwoone)
onetwothree
使用
sed

$ echo onetwoone
onetwoone
$ sed 's/one$/three/' <<< $(echo !$)
sed 's/one$/three/' <<< $(echo onetwoone)
onetwothree

谢谢你的回复。实际上,如果将此变通方法应用于诸如“mv”、“cp”之类的命令,则不适用
fc
将是一个很好的选择,但它不能应用于“当前命令”以替换诸如“!#:1:s/old/new”之类的引用。无论如何,谢谢你。