2010-01-27 8 views
39

난 그냥 배쉬에서 다음 명령을 입력 한 경우 : I 입력하여 바 foo는 변경할 수 있습니다캐럿 검색 배쉬 쉘에서 대체

echo foo 

:

^foo^bar 

다음 명령 결과 실행중인 :

echo bar 

를 이제 입력하면 :

echo foo foo 

캐럿 (^) 연산자를 사용하여 foo와 bar의 두 인스턴스를 모두 바꿀 수 있습니까?

또한 쉘 운영자 용 설명서 페이지는 ^입니까? man ^의 결과는 "^ 수동 입력 없음"입니다.

+2

감사와 함께 할 수 교체 그것은 내가 쉽게 기억할 수있는 것이지만 라인 노이즈 버전을 암기해야 할 것처럼 보인다. – mattjames

+1

'^ : string1^string2'가 이미'!! : s/string1/string2/'와 같은 것으로 생각된다면 "line noise"버전을 기억하는 것이 더 쉬울 수도 있습니다. – isomorphismes

+0

@mattjames 뭔가를 기억하기 쉽게하려면 "회선 잡음"이 적은 내 대답을 확인하십시오. -y – MLP

답변

48

와 foo는 대체 말한다 ; 그 문서는 Bash 매뉴얼의 Event Designators 섹션에서 찾을 수 있습니다. 빠른 대체로 원하는 것을 할 수는 없습니다. 당신은 약간 더 자세한 무언가에 의존해야합니다 :

!!:gs/foo/bar/ 
+0

@scanny : 어디서나 문서화되지 않은 것 같습니다. bash 4.2.10 (1). 어떤 버전의 쉘을 사용하고 있습니까 ('bash --version')? –

+0

죄송합니다. 내 실수는 뇌에 'zsh'입니다! : S 코멘트를 삭제했습니다. – scanny

+0

OSX에서는 나에게'! : gs/foo/bar'가 필요하지 않습니다. –

27

아니다 캐럿 대체와 함께 할 방법을 잘하지만, 여기 당신이 역사와 함께 할 방법은 다음과 같습니다

!!:gs/foo/bar/ 

날 그 분해 보자

! - 마지막 명령을 다시 실행합니다. 또한! -2를 사용하여 두 명령을 실행 한 후!! echo로 시작하는 마지막 명령을 실행합니다.

: gs는 전역 (모든 인스턴스) 검색/바꾸기를 수행합니다. 당신은 단지 첫 번째 인스턴스를 대체하려면 원하는 경우 사용합니다 '의'마지막

를,/푸/바/특정 기능이 빠르게 대체라는 것을 바

5

캐럿 대체 및 기타 유사한 단축키는 bash(1) man 페이지의 역사 EXPANSION 섹션의 이벤트 지정자 항에서 발견된다.

1
^word^ ........... erase word 
^word^^ ........... delete everything until the end of the line 
+3

이 두 가지 모두 똑같은 기능을합니다 : 명령에서 단어 만 제거하십시오. –

+0

여기에서 동일합니다. '% 에코 "워드 워드 워드 워드 단어" 워드 워드 워드 워드 워드 %^워드 ^^ 에코 "워드 워드 워드 단어" 워드 워드 워드 워드 ' – isomorphismes

21

시도 :

^foo^bar^:& 

당신은 단지 하나의 대체 ^foo^bar^ 수행을 알고, 그리고 :& 수정이 반복으로

.

+9

이 두 치환 아니라 글로벌 교체를 실행한다. – isomorphismes

+2

여러 개의 ": &"수정자를 캐럿 대체에 전달할 수 있음을 발견했습니다. 따라서 ": &"는 다시 의미하며 ": & : &"는 다시 두 번 의미합니다. (반복 : 매 반복마다 &는 지루할 것입니다. 나는 !! : gs //에 대해 배울 수있어서 기쁩니다. – rickumali

0

위의 !!:gs/foo/bar/과 같은 것을 수행하는 것을 기억하기가 덜 어려운 곳을 찾고 있다면 .bash_profile 시작 스크립트에서 항상 함수를 만들 수 있습니다. 나는 replace()을 선택했다.

replace() { 
    eval $(echo $(fc -ln -1) | eval "sed 's/${1}/${2}/g'") #compact form 
} 

OR, 이하 convolutedly

replace() { 
    string=$(fc -ln -1) #gets last command string 
    repcmmd="sed 's/${1}/${2}/g'" #build replacement sed command from fn input 
    eval $(echo $string | eval $repcmmd) #evaluates the replacement command 
} 

는 그런 다음 모든 이후 중복에 대한^구문을 사용하는 방법을 기대했다, 답변에 대한

echo foo foo 
replace foo bar