Bash 中所有匹配的^单词^替换^?

发布于 2024-07-14 21:56:18 字数 139 浏览 8 评论 0原文

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

是否有一些 set 选项让我困惑?

To clarify, I am looking for a way to perform a global search and replace on the previous command used. ^word^replacement^ only seems to replace the first match.

Is there some set option that is eluding me?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

绅刃 2024-07-21 21:56:19

解决这个问题的一种糟糕的方法可能是这样的:

想要通过将 L 替换为 A 来回显 BAABAA 而不是 BLABLA

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

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

A nasty way to get around this could be something like this:

Want to echo BAABAA rather than BLABLA by swapping L's for A's

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

Unfortunately this technique doesn't seem to work in functions or aliases.

夜唯美灬不弃 2024-07-21 21:56:19

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

I test it on SUSE 10.1.
"^word^replacement^" doesn't work, while "^word^replacement" works well.
for a instance:

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 #   
霓裳挽歌倾城醉 2024-07-21 21:56:18

尝试这个:

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

Try this:

$ echo oneone
oneone
$ !!:gs/one/two/    # Repeats last command; substitutes 'one' --> 'two'.
twotwo
不即不离 2024-07-21 21:56:18

此解决方案使用 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

This solution uses Bash Substring Replacement:

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

Note the use of the double slashes denotes "global" string replacement.

This solution can be executed in one line.

Here's how to globally replace a string in a file named "myfile.txt":

$ sed -i -e "s/word/replacement/g" myfile.txt
混吃等死 2024-07-21 21:56:18

混合我的答案 这里与约翰·费米内拉的你可以这样做,如果你想要一个别名:

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

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

Blending my answer here with John Feminella's you can do this if you want an alias:

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

The !! only does the previous command, while !?string? matches the most recent command containing "string".

叹沉浮 2024-07-21 21:56:18

这个问题有很多重复,一个优雅的答案只出现在unix SE

中用户@Mikel的这个答案中fc -s pat=rep

这个 bash 内置函数记录在 9.2 Bash 历史内置函数

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

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

this question has many dupes and one elegant answer only appears in this answer of user @Mikel in unix se

fc -s pat=rep

this bash builtin is documented under the chapter 9.2 Bash History Builtins

In the second form, command is re-executed after each instance of pat
in the selected command is replaced by rep. command is interpreted the
same as first above.

A useful alias to use with the fc command is r='fc -s', so that typing
‘r cc’ runs the last command beginning with cc and typing ‘r’
re-executes the last command (see Aliases).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文