^ слово ^ замена ^ на всех совпадениях в Bash? - PullRequest
47 голосов
/ 16 марта 2009

Чтобы уточнить, я ищу способ выполнить глобальный поиск и замену предыдущей использованной команды. ^word^replacement^ похоже только заменяет первый матч.

Есть ли какая-то опция set, которая ускользает от меня?

Ответы [ 5 ]

64 голосов
/ 16 марта 2009

Попробуйте это:

$ echo oneone
oneone
$ !!:gs/one/two/    # Repeats last command; substitutes 'one' --> 'two'.
twotwo
6 голосов
/ 08 декабря 2014

В этом решении используется замена подстроки 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
6 голосов
/ 20 апреля 2009

Смешивая мой ответ здесь с Джоном Феминеллой, вы можете сделать это, если хотите псевдоним:

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

The !! только предыдущая команда, а!? строка? соответствует самой последней команде, содержащей «строку».

1 голос
/ 16 марта 2009

Гадкий способ обойти это может быть что-то вроде этого:

Хотите повторить BAABAA, а не BLABLA, поменяв буквы L на A

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

К сожалению, эта техника, похоже, не работает в функциях или псевдонимах.

0 голосов
/ 26 сентября 2013

Я тестирую его на SUSE 10.1. «^ слово ^ замена ^» не работает, в то время как «^ слово ^ замена» работает хорошо. например:

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 #   
...