为了澄清,我正在寻找一种方法来执行全局搜索和替换上一个使用的命令。^word^replacement^
似乎只取代了第一场比赛。
有没有一些set
选择让我望而却步?
试试这个:
$ 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? 匹配包含“字符串”的最新命令。
此解决方案使用 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
解决这个问题的一个讨厌的方法可能是这样的:
想要回应BAABAA
而不是BLABLA
将 L 换成 A
$ echo "BLABLA"
BLABLA
$ `echo "!!" | sed 's/L/A/g'`
$(echo "echo "BLABLA" " | sed 's/L/A/g')
BAABAA
$
不幸的是,这种技术似乎不适用于函数或别名。
这个问题有很多骗子,一个优雅的答案只出现在 unix se 用户@Mikel 的这个答案中
fc -s pat=rep
这个 bash 内置记录在第9.2 章 Bash History Builtins下
在第二种形式中,在所选命令中的每个 pat 实例被 rep 替换后,重新执行命令。命令的解释与上面的第一个相同。
与 fc 命令一起使用的有用别名是 r='fc -s',因此键入 'r cc' 会运行以 cc 开头的最后一个命令,键入 'r' 会重新执行最后一个命令(请参阅别名)。
我在 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 #