질문
특정 문자열이 포함된 줄 수를 얻기 위해 방금 다음 명령을 입력했다고 가정해 보겠습니다.
me@machine $ command-producing-multi-line-output | grep -i "needle" | wc -l
이제 어떻게 하면 "needle"
이 단어를 다른 단어로 빨리 바꿀 수 있을까요?
현재의 비효율적인 솔루션
지금 나는:
Up
키보드를 눌러 마지막 명령을 로드합니다.- 에 도달할 때까지
Left
또는Ctrl
+를 누릅니다 .Left
"needle"
- 단어를 삭제하려면
Backspace
또는Ctrl
+를 누르세요 .w
- 새 단어를 입력하거나 붙여넣으세요.
- 이기다
Enter
.
이는 매우 비효율적인 것 같습니다.
비효율적인 솔루션 시도
예를 들어 역사적인 지름길을 조사해 보았지만 !!:sg/needle/new-needle
여기에는 몇 가지 문제가 있습니다.
- 명령줄
Up
로 돌아가는 키를 누를 수 없습니다 .!!:sg/needle/new-needle
이렇게 하면 확장된 내용이 표시됩니다(원래 질문으로 직접 돌아가기). - 다른 새 바늘로 이것을 반복하려면 교체
needle
와new-needle
(즉!!:sg/new-needle-from-before/yet-another-new-needle
)이 모두 필요합니다. - 핀의 길이에 관계없이 시간/키 입력을 절약하려면 또는 같은 것을 사용하는 대신 전체 내용을 입력 해야 합니다
needle
.!:4
$4
!!:sg/!:4/new-needle
!!:sg/$4/new-needle
비슷한 것을 찾았 !:^-3 "new-needle" !:5-$
지만 문제도 있었습니다.
- 히스토리가 확장되므로 빠르게 재사용할 수 없습니다.
- 확장되지 않더라도 명령 체인 중간에 단어를 바꿔야 하는 원래의 문제는 여전히 남아 있습니다.
나는 내가 하고 싶은 일을 성취할 수 있는 매우 빠른 방법이 있을 것이라고 믿으며 일부 Linux 전문가는 그것을 알고 있습니다. 이에 대한 의견이나 제안이 있으시면 매우 감사하겠습니다.
편집하다:
배경
약간의 배경 지식을 제공하기 위해 저는 명령줄에서 OpenStack을 사용하여 작업하며 파이프라인 명령의 긴 명령 체인의 여러 위치에서 매개 변수를 대체해야 하는 경우가 종종 있습니다.
OpenStack 환경이 구성되는 방식은 여러 엔지니어가 stack
원하는 수의 서버에서 사용자를 공유하고 여러 환경에 걸쳐 여러 클러스터가 있다는 것입니다. 따라서 .bashrc
또는 파일에 선언된 함수는 .profile
실제로 불가능합니다.
신속하게 사용할 수 있고 설정이 전혀 필요하지 않거나 최소한의 설정만 필요한 휴대용 장치를 갖고 싶습니다. 그렇지 않으면 완전히 셸 외부의 솔루션(예: AutoHotKey/Keyboard Maestro/AutoKey 등의 클립보드 교체)을 사용해야 할 수도 있습니다.
답변1
그건정확히무엇역사적 확장사용:
$ command-producing-multi-line-output | grep -i "needle" | wc -l
...
$ ^needle^nipple
command-producing-multi-line-output | grep -i "nipple" | wc -l
...
답변2
비슷한 상황이 발생했으며 유용한 패턴인 경우 여기에 솔루션을 제시합니다.
데이터 조각을 계속해서 변경하고 대화형 교체가 귀찮다는 사실을 깨닫고 중지하고 작은 루프를 작성했습니다 while
.
$ command-producing-multi-line-output | grep -i "needle" | wc -l
0
$ command-producing-multi-line-output | grep -i "haystack" | wc -l
0
$ while read needle; do
Up-Arrow이전 줄로 이동하여 다음 줄로 command-producing-multi-line-output
바꿉니다 ."haystack"
"$needle"
command-producing-multi-line-output | grep -i "$needle" | wc -l; done
something
0
something else
0
gold
1
Control( + 로 끝남 D)
또는 약간 화려한 변형:
$ while read needle; do
printf 'For: %s\n' "$needle"
command-producing-multi-line-output | grep -i "$needle" | wc -l; done
"오늘" 이후에 이 명령줄의 미래가 보인다면 이를 함수나 스크립트에 작성하겠습니다.
답변3
유용한 별칭은 다음 bash
과 같습니다.
alias r='fc -s'
기본적으로 이 r
명령은 다른 쉘에서도 자주 발견되며1 역사상 가장 최근 명령을 반복합니다. 매뉴얼 bash
에는 정의에 대한 유용한 별칭도 있습니다.
[...] A useful alias to use with this is ``r="fc -s"'',
so that typing ``r cc'' runs the last command beginning with
``cc'' and typing ``r'' re-executes the last command.
또한 마지막 명령의 텍스트 내에서 대체를 수행할 수도 있습니다.
여기서는 명령을 실행한 다음 위의 별칭을 사용하여 단어 needle
별로 바꿉니다 haystack
.
$ command-producing-multi-line-output | grep -i "needle" | wc -l
bash: command-producing-multi-line-output: command not found
0
$ r needle=haystack
command-producing-multi-line-output | grep -i "haystack" | wc -l
bash: command-producing-multi-line-output: command not found
0
명령줄에서 이를 사용 하면 r needle=haystack
쉘은 실행할 명령을 인쇄한 다음 즉시 실행합니다. 보시다시피, 그것은 또한 단어를 대체합니다.
이러한 오류는 분명히 command-producing-multi-line-output
명령 부족으로 인해 발생하지만 이 연습에서는 문제가 되지 않습니다.
명령은 fc
기록에 저장되지 않지만 다음과 같이 셸 함수로 생성하여 저장할 수 있습니다.
fc() {
command fc "$@"
history -s fc "$@" # append the given fc command to history
}
그럼 당신은 할 수 있습니다
$ command-producing-multi-line-output | grep -i "needle" | wc -l
bash: command-producing-multi-line-output: command not found
0
다음으로 comm
시작하는 최신 명령을 다시 실행하십시오 .needle
r needle=haystack comm
$ r needle=haystack comm
command-producing-multi-line-output | grep -i "haystack" | wc -l
bash: command-producing-multi-line-output: command not found
0
가장 최근 명령을 다시 실행하고 haystack
다음으로 바꿉니다 r haystack=beeswax
.
$ r haystack=beeswax
fc -s needle=beeswax comm
command-producing-multi-line-output | grep -i "beeswax" | wc -l
bash: command-producing-multi-line-output: command not found
0
fc
마지막 줄의 이중 호출에 주목하세요. 먼저 별칭을 통해 r
, 그 다음에는 함수를 통해 호출합니다 fc
.
분명히 fc
명령을 기록에 저장하면 실수로 재귀 호출이 발생할 위험이 있습니다 fc -s
.
1 내장 명령 이며 OpenBSD에서는 기본 별칭 , OpenBSD에서는 기본 별칭 등 입니다.zsh
ksh
fc -s
ksh93
hist -s
답변4
요약: Ctrl++R nee
AltD haystack
Enter
역방향을 시작하려면 Ctrl+를 누르세요 .R증분 검색원하는 명령줄의 원하는 부분이 나타날 때까지(이전 명령줄일 필요는 없음) 바꾸려는 텍스트(또는 매우 유사한 텍스트)의 몇 문자를 입력합니다. 이전 항목을 검색하려면 Ctrl+를 누르세요 . R너무 멀리 돌아가면 Ctrl+를 눌러 S앞으로 이동하세요. Backspace잘못된 문자를 입력한 경우 이 키를 누르세요.
원하는 위치에 도달하면 , + 또는 +와 같은 키를 사용하여 Delete커서 Alt주변 D의 Alt텍스트 Backspace삭제를 시작하거나 Escape도달한 위치에서 간단히 증분 검색을 종료할 수 있습니다.
Enter명령줄 편집을 마친 후에만 이 키를 누르십시오. 증분 검색 중에 일반적인 의미 는 Enter현재 명령줄을 있는 그대로 실행하는 것입니다. 단순히 검색 모드를 종료하는 것이 아닙니다( Escape검색 모드를 종료하려면 누르세요).