^Bash中所有匹配项上的单词^replacement^?

^Bash中所有匹配项上的单词^replacement^?,bash,shell,sh,Bash,Shell,Sh,为了澄清这一点,我正在寻找一种方法来对以前使用的命令执行全局搜索和替换^word^replacement^似乎只替换第一个匹配项 是否有一些set选项让我无法选择 解决这个问题的一个讨厌的方法可能是这样的: 想通过将L换成A来回应BAABAA而不是BLABLA $ echo "BLABLA" BLABLA $ `echo "!!" | sed 's/L/A/g'` $(echo "echo "BLABLA" " | sed 's/L/A/g') BAABAA $ 不幸的是,这种技术在函数

为了澄清这一点,我正在寻找一种方法来对以前使用的命令执行全局搜索和替换
^word^replacement^
似乎只替换第一个匹配项


是否有一些
set
选项让我无法选择

解决这个问题的一个讨厌的方法可能是这样的:

想通过将L换成A来回应
BAABAA
而不是
BLABLA

$ echo "BLABLA"   
BLABLA
$ `echo "!!" | sed 's/L/A/g'`
$(echo "echo "BLABLA" " | sed 's/L/A/g')
BAABAA
$
不幸的是,这种技术在函数或别名中似乎不起作用。

尝试以下方法:

$ echo oneone
oneone
$ !!:gs/one/two/    # Repeats last command; substitutes 'one' --> 'two'.
twotwo
将我的答案与John Feminella的答案混合在一起,如果你想要一个别名,你可以这样做:

$alias dothis='`history -p "!?monkey?:gs/jpg/png/"`'
$ls *.jpg
monkey.jpg
$dothis
monkey.png
这个!!只执行上一个命令,而!?一串匹配包含“string”的最新命令。

我在SUSE 10.1上测试它。 “^word^replacement^”不起作用,而“^word^replacement”效果很好。 例如:

linux-geek:/home/Myworks # ls /etc/ld.so.conf   
/etc/ld.so.conf  
linux-geek:/home/Myworks # ^ls^cat  
cat /etc/ld.so.conf  
/usr/X11R6/lib/Xaw3d  
/usr/X11R6/lib  
/usr/i486-linux-libc5/lib=libc5  
/usr/i386-suse-linux/lib  
/usr/local/lib  
/opt/kde3/lib  
/opt/gnome/lib  
include /etc/ld.so.conf.d/*.conf  
linux-geek:/home/Myworks #   

此解决方案使用Bash子字符串替换:

$ SENTENCE="1 word, 2 words";echo "${SENTENCE//word/replacement}"
1 replacement, 2 replacements
请注意,使用双斜杠表示“全局”字符串替换

此解决方案可以在一行中执行

下面介绍如何全局替换名为“myfile.txt”的文件中的字符串:


你确定你打对了吗?这对我来说很好。(我正在使用GNU bash,版本3.2.48(1)-发行版。)刚刚在旧版本的bash上测试过,而且(毫不奇怪)它不起作用:
$echo$bash\u版本
(2.05.8(1)-发行版)
$echo oneone
(out:oneone)
$:gs/one/two
(输出:twoone)
$echo$BASH_版本
(out:3.2.25(1)-发布)
$echo-oneone
(out:oneone)
$:gs/one/two
(输出:two-two)。。。关于所有事情的一般建议?使用版本3+这里的
gs
是什么意思?全局替换?@Zen:是:全局替换。如果要最小化字符,不需要感叹号和最后一个斜杠:
$cp foo.h bar.h
$!:gs/.h/.cpp
(执行:cp foo.cpp bar.cpp),但这只替换上一行中单词的一个实例(恰好是命令)。尝试使用
^
变电站方法将线路
ls/etc/passwd/etc/passwd
更改为
ls/etc/hosts/etc/hosts
。这根本不起作用。没有一个命令叫做monkey,所以在我的历史中没有包含monkeyRight的命令。此外,这会产生昂贵的分叉。在一个涉及数千次迭代的操作中,这会造成很大的时间延迟。
$ sed -i -e "s/word/replacement/g" myfile.txt