^字^替换^在Bash的所有比赛?

时间:2009-03-16 02:27:35

标签: bash shell sh

为了澄清,我正在寻找一种方法来执行全局搜索并替换上一个使用的命令。 ^word^replacement^似乎只取代了第一场比赛。

是否有一些set选项让我不知所措?

5 个答案:

答案 0 :(得分:64)

试试这个:

$ echo oneone
oneone
$ !!:gs/one/two/    # Repeats last command; substitutes 'one' --> 'two'.
twotwo

答案 1 :(得分:6)

将我的答案here与John Feminella混合,如果你想要一个别名,你可以这样做:

$alias dothis='`history -p "!?monkey?:gs/jpg/png/"`'
$ls *.jpg
monkey.jpg
$dothis
monkey.png

!!只执行上一个命令,而!?string?匹配包含“string”的最新命令。

答案 2 :(得分:6)

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

$ SENTENCE="1 word, 2 words";echo "${SENTENCE//word/replacement}"
1 replacement, 2 replacements

请注意,使用双斜杠表示“全局”字符串替换。

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

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

$ sed -i -e "s/word/replacement/g" myfile.txt

答案 3 :(得分:1)

解决这个问题的一种令人讨厌的方式可能是这样的:

希望通过将L's换成A来回复BAABAA而不是BLABLA

$ echo "BLABLA"   
BLABLA
$ `echo "!!" | sed 's/L/A/g'`
$(echo "echo "BLABLA" " | sed 's/L/A/g')
BAABAA
$

不幸的是,这种技术似乎不适用于函数或别名。

答案 4 :(得分:-1)

我在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 #