파이프라인 명령 체인에서 매개변수를 빠르게 바꾸는 방법

파이프라인 명령 체인에서 매개변수를 빠르게 바꾸는 방법

질문

특정 문자열이 포함된 줄 수를 얻기 위해 방금 다음 명령을 입력했다고 가정해 보겠습니다.

me@machine $ command-producing-multi-line-output | grep -i "needle" | wc -l

이제 어떻게 하면 "needle"이 단어를 다른 단어로 빨리 바꿀 수 있을까요?


현재의 비효율적인 솔루션

지금 나는:

  1. Up키보드를 눌러 마지막 명령을 로드합니다.
  2. 에 도달할 때까지 Left또는 Ctrl+를 누릅니다 .Left"needle"
  3. 단어를 삭제하려면 Backspace또는 Ctrl+를 누르세요 .w
  4. 새 단어를 입력하거나 붙여넣으세요.
  5. 이기다 Enter.

이는 매우 비효율적인 것 같습니다.


비효율적인 솔루션 시도

예를 들어 역사적인 지름길을 조사해 보았지만 !!:sg/needle/new-needle여기에는 몇 가지 문제가 있습니다.

  1. 명령줄 Up로 돌아가는 키를 누를 수 없습니다 . !!:sg/needle/new-needle이렇게 하면 확장된 내용이 표시됩니다(원래 질문으로 직접 돌아가기).
  2. 다른 새 바늘로 이것을 반복하려면 교체 needlenew-needle(즉 !!:sg/new-needle-from-before/yet-another-new-needle)이 모두 필요합니다.
  3. 핀의 길이에 관계없이 시간/키 입력을 절약하려면 또는 같은 것을 사용하는 대신 전체 내용을 입력 해야 합니다 needle.!:4$4!!:sg/!:4/new-needle!!:sg/$4/new-needle

비슷한 것을 찾았 !:^-3 "new-needle" !:5-$지만 문제도 있었습니다.

  1. 히스토리가 확장되므로 빠르게 재사용할 수 없습니다.
  2. 확장되지 않더라도 명령 체인 중간에 단어를 바꿔야 하는 원래의 문제는 여전히 남아 있습니다.

나는 내가 하고 싶은 일을 성취할 수 있는 매우 빠른 방법이 있을 것이라고 믿으며 일부 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시작하는 최신 명령을 다시 실행하십시오 .needler 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에서는 기본 별칭 등 입니다.zshkshfc -sksh93hist -s

답변4

요약: Ctrl++R nee AltD haystack Enter

역방향을 시작하려면 Ctrl+를 누르세요 .R증분 검색원하는 명령줄의 원하는 부분이 나타날 때까지(이전 명령줄일 필요는 없음) 바꾸려는 텍스트(또는 매우 유사한 텍스트)의 몇 문자를 입력합니다. 이전 항목을 검색하려면 Ctrl+를 누르세요 . R너무 멀리 돌아가면 Ctrl+를 눌러 S앞으로 이동하세요. Backspace잘못된 문자를 입력한 경우 이 키를 누르세요.

원하는 위치에 도달하면 , + 또는 +와 같은 키를 사용하여 Delete커서 Alt주변 DAlt텍스트 Backspace삭제를 시작하거나 Escape도달한 위치에서 간단히 증분 검색을 종료할 수 있습니다.

Enter명령줄 편집을 마친 후에만 이 키를 누르십시오. 증분 검색 중에 일반적인 의미 는 Enter현재 명령줄을 있는 그대로 실행하는 것입니다. 단순히 검색 모드를 종료하는 것이 아닙니다( Escape검색 모드를 종료하려면 누르세요).

관련 정보