^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