49

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

有没有一些set选择让我望而却步?

4

6 回答 6

66

试试这个:

$ echo oneone
oneone
$ !!:gs/one/two/    # Repeats last command; substitutes 'one' --> 'two'.
twotwo
于 2009-03-16T02:55:10.277 回答
6

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

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

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

于 2009-04-20T17:12:30.780 回答
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
于 2014-12-08T03:54:08.323 回答
1

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

想要回应BAABAA而不是BLABLA将 L 换成 A

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

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

于 2009-03-16T02:54:31.433 回答
1

这个问题有很多骗子,一个优雅的答案只出现在 unix se 用户@Mikel 的这个答案中

fc -s pat=rep

这个 bash 内置记录在第9.2 章 Bash History Builtins下

在第二种形式中,在所选命令中的每个 pat 实例被 rep 替换后,重新执行命令。命令的解释与上面的第一个相同。

与 fc 命令一起使用的有用别名是 r='fc -s',因此键入 'r cc' 会运行以 cc 开头的最后一个命令,键入 'r' 会重新执行最后一个命令(请参阅别名)。

于 2021-09-30T10:18:42.817 回答
-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 #   
于 2013-09-26T01:25:15.190 回答