^ x ^ y sztuczka unixowa dla wszystkich instancji w ostatnim poleceniu?


97

Jedną z moich ulubionych sztuczek uniksowych jest ^x^ywzięcie ostatniego polecenia i zastąpienie pierwszego wystąpienia „x” „y”. Zastanawiam się jednak, czy podobna sztuczka działa w zamian wszystkich wystąpień „x” na „y” w ostatnim poleceniu?


2
Ta funkcja nazywa się rozszerzaniem historii. Wygląda na to, że używamy do tego command-historytagu. Dodany. Zakładam też, że masz na myśli bashpowłokę?
Mikel

Odpowiedzi:


107

Za pomocą !!:gs/search/replace/notacji możesz robić, co chcesz. Wykorzystuje to globalne wyszukiwanie i zamianę ( :gs):

przed

$ echo "harm warm swarm barm"
harm warm swarm barm

po

$ !!:gs/arm/orn/
echo "horn worn sworn born"
horn worn sworn born

Bibliografia


1
@slm to polecenie zastępuje dla mnie tylko pierwszą instancję. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. czego mi brakuje?
Geek

@Geek - jaka jest twoja dystrybucja? Czy używasz Bash? Wersja? bash --version= 4.2.45 (1) -release.
slm

@slm GNU bash, wersja 3.2.25 (1) -release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc.
Geek

@Geek - zbyt stara wersja, nie oferuje tej funkcji.
slm

45

Nie sądzę, że istnieje prosty sposób na dodanie czegoś, co ^string1^string2sprawi, że bashzastąpi każde wystąpienie. Jak wskazuje SLM, musisz pisać !!:gs/string1/string1.

Ale zshmożesz po prostu dodać :G:

$ echo foo foo
foo foo
$ ^foo^bar^:G
echo bar bar
bar bar

W obu przypadkach bash, a zshmożna też użyć fc -stakiego:

$ echo foo foo
foo foo
$ fc -s foo=bar
echo bar bar
bar bar

Często jest to przekształcane w alias o nazwie, rdzięki czemu możesz po prostu:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar

Wow, to też jest naprawdę fajne
Mason

2

Uważam, że najlepszą opcją jest użycie „: &”

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat

3
Zastępuje to 2 wystąpienia, nie wszystkie z nich (cóż, wszystko w tym przykładzie, ponieważ są tylko 2 wystąpienia, ale nie w ogólnym przypadku). Musisz dodać tyle, :&ile jest więcej wystąpień do zastąpienia.
Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.