Иногда мы используем в Linux команды с кучей длинных аргументов, а так же используем их многократно друг за другом, но меняя лишь пару параметров.
Пример :
touch /home/user1/test/scenario.txt /etc/my-server/users/user1.cnf /var/log/my-server/user1.log
Что делать если тоже самое надо выполнить для user2?
Для изменения всех вхождений в последней команде можно использовать вот такую конструкцию:
!:gs/old_occurrence/new_occurrence
! вызывает последнюю команду
gs выполняет глобальную замену
Для замены слова можете выполнить вот такую команду:
^old_word^new_word
Примеры:
[www.linux] root:~ # touch test1 scenario1 result1 [www.linux] root:~ # !:gs/1/2 touch test2 scenario2 result2 [www.linux] root:~ # ls -l test* scenario* result* -rw-r--r-- 1 root root 0 Nov 20 16:45 result1 -rw-r--r-- 1 root root 0 Nov 20 16:45 result2 -rw-r--r-- 1 root root 0 Nov 20 16:45 scenario1 -rw-r--r-- 1 root root 0 Nov 20 16:45 scenario2 -rw-r--r-- 1 root root 0 Nov 20 16:45 test1 -rw-r--r-- 1 root root 0 Nov 20 16:45 test2
[www.linux] root:~ # mkdir -p tests/exp/scenario1/tools/ [www.linux] root:~ # ^exp^lab mkdir -p tests/lab/scenario1/tools/ [www.linux] root:~ # tree tests tests ├── exp │ └── scenario1 │ └── tools └── lab └── scenario1 └── tools 6 directories, 0 files
Прим.: при использовании команды ^^ на множество вхождений, будет заменено только первое вхождение.
Пример:
[www.linux] root:~ # ls -l test1 scenario1 result1 -rw-r--r-- 1 root root 0 Nov 20 16:45 result1 -rw-r--r-- 1 root root 0 Nov 20 16:45 scenario1 -rw-r--r-- 1 root root 0 Nov 20 16:45 test1 [www.linux] root:~ # ^1^2 ls -l test2 scenario1 result1 -rw-r--r-- 1 root root 0 Nov 20 16:45 result1 -rw-r--r-- 1 root root 0 Nov 20 16:45 scenario1 -rw-r--r-- 1 root root 0 Nov 20 16:45 test2
Замена последнего слова в истории
Например мы запустили команду ls и хотим заменить её на cat для просмотра содержимого. Для этого мы можем использовать для этого быстрые замены bash : !$ или $_
ls -l /etc/passwd cat $_ или cat !$