2009-03-16 6 views
46

명확히하기 위해 나는 번 글로벌 검색을 수행하고 이전에 사용 된 명령을 대체 할 방법을 찾고 있습니다. ^word^replacement^ 만 첫 번째 경기를 대체하는 것으로 보입니다.^word^replacement^배쉬의 모든 경기?

set 옵션이 있습니까?

답변

63

이 시도 :

$ echo oneone 
oneone 
$ !!:gs/one/two/ # Repeats last command; substitutes 'one' --> 'two'. 
twotwo 
+0

이것은 나를 위해 작동하지 않습니다. 나는 '두 가지'가된다 – finnw

+0

당신은 그것을 정확하게 타이핑 했습니까? 그것은 나를 위해 잘 작동합니다. (나는 GNU bash 버전 3.2.48 (1) -release를 사용하고있다.) –

+1

은 bash의 이전 버전에서 방금 테스트되었고, (unsurprising) 작동하지 않는다. '$ echo $ BASH_VERSION' _ (2.05 _ '$ echo oneone' _ (out : oneone) _ '$ !! : gs/one/two' _ (out : twoone) _ ... '$ echo $ _ '$ echo oneone' _ (out : oneone) _ '$ !! : gs/one/two' _ (out : twotwo) _ (바깥 쪽 : 3.2.25 (1) ... 모든 일에 대한 일반적인 조언 bash? 버전 3 이상 사용하기 – michael

1

불쾌한 방법은 다음과 같이 될 수있다이 문제를 해결 얻을 :

가 L의 교환에 의해 BAABAA보다는 BLABLA 에코하려는의

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

불행하게도이 기술에서 작동하지 않는 것 함수 또는 별명.

+0

오른쪽 :

여기에 "MYFILE.TXT"라는 이름의 파일에 문자열을 교체 전역하는 방법은 다음과 같습니다. 또한 값 비싼 포크가 생성됩니다. 수천 번의 반복을 포함하는 작업에서는 상당한 시간을 소비하게됩니다. – xizdaqrian

5

존 Feminella의 내 대답 here을 혼합하면 별칭을하려는 경우이 작업을 수행 할 수 있습니다

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

을! 이전 명령 만 수행하지만!? string? "string"을 포함하는 가장 최근의 명령과 일치합니다.

+0

그건 전혀 작동하지 않습니다. 원숭이라는 명령이 없었기 때문에 원숭이를 포함하는 내 역사에는 아무 것도 없었습니다. –

-1

수세 10.1에서 테스트합니다. "^ word^replacement ^"는 작동하지 않지만 "^ word^replacement"는 잘 작동합니다. 인스턴스 (instance)에 대한 : 이중 슬래시의 사용은 "글로벌"문자열 교체 의미

$ SENTENCE="1 word, 2 words";echo "${SENTENCE//word/replacement}" 
1 replacement, 2 replacements 

참고 :

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 # 
+0

하지만 이전 행의 단어의 * 인스턴스 만 대체합니다 (명령 일 가능성이 있습니다). 'ls/etc/passwd/etc/passwd' 행을'^^'변전소 방법으로'ls/etc/hosts/etc/hosts' 행으로 변경하십시오. –

4

이 솔루션은 배쉬 하위 문자열 교체를 사용합니다.

이 솔루션은 한 줄로 실행할 수 있습니다.

$ sed -i -e "s/word/replacement/g" myfile.txt