Bash에서 마우스를 사용하지 않고 표시된 텍스트 파일의 URL을 어떻게 복사할 수 있습니까?

Bash에서 마우스를 사용하지 않고 표시된 텍스트 파일의 URL을 어떻게 복사할 수 있습니까?

당신을 짧은 여행으로 데려가겠습니다.

터미널을 엽니다.

유형

cat <any text file in your current working directory, containing a URL, at the beginning> | head

텍스트 파일의 처음 10줄은 표준 출력으로 인쇄되어 화면에 표시됩니다.

내 경우에는 다음과 같습니다.

(Beginning of line 7)yada yada yada [[https://example-url-1.com][Example URL #1]] - [[https://example-url-2.com][Example URL #2]] yada yada yada (End of line 7)

두 개의 링크는 7행 중앙에 있으며, 한 줄에만 있는 것이 아니라 텍스트로 둘러싸여 있습니다.

이제 퀴즈 질문은 다음과 같습니다. URL #2를 메모리에 복사하여 마우스를 사용하지 않고 다른 프로그램에 붙여넣을 수 있도록 하려면 어떻게 해야 합니까?

GNU 이맥스에서? 매우 쉬움: "ht" 검색 - 커서가 링크의 시작 부분인 CM SPC로 이동하고 링크에 태그가 지정되고 Mw가 태그된 부분이 복사됩니다. 하지만 bash에서는 어떻습니까?

답변1

사용할 때 다음과 같은 작업을 수행할 수 있습니다.멀티플렉서. 그것은 가지고있다검색 가능한 복사 모드Emacs와 유사한 키 바인딩을 제공합니다.

C-b(접두사)를 사용한 다음 (기본 키 바인딩)을 사용하여 복사 모드로 들어갈 수 있고 C-[, 검색 출력을 사용하고 C-s, 단어 시작으로 이동을 사용하고 M-b, 선택 시작을 사용하고 C-Space, 커서를 이동하여 원하는 것을 표시하고(명령 바인딩도 가능 next-word), 복사 대상을 사용할 수 있습니다. 선택하고 복사 모드를 종료 M-w한 다음 붙여넣기를 사용합니다 C-].

내가 아는 한 이는 기본 바인딩이지만 다르게 바인딩할 수도 있습니다. 추가 조치를 취해야 할 수도 있습니다.붙여넣기 버퍼를 시스템 클립보드와 동기화이것을 터미널 외부에 붙여넣고 싶다면! 하지만 제가 겪은 비슷한 일을 생각하는 것만으로도 PTSD가 생기기 때문에 어쨌든 그것은 저를 조금 넘어서는 것입니다.

이는 터미널 에뮬레이터 내에서 터미널 에뮬레이터 역할을 하는 소위 터미널 멀티플렉서입니다. Tmux에는 자체적인 문제(예: 구성에 필요한 시간, 추가 간접 계층 등)가 있을 수 있습니다. 귀하의 작업 흐름에 적합할 수도 있고 그렇지 않을 수도 있지만, Emacs를 사용한다면 시간을 내어 구성하고 자신에게 적합한지 평가할 의향이 있다고 가정합니다. 질문이 있으시면 저에게 연락해주세요

답변2

아, 하지만 쉘의 역할은 단지 (프로그래밍 가능한) 명령 인터페이스를 제공하고 다른 프로그램을 실행하는 것뿐입니다. 그렇지 않습니다.하다이러한 프로그램의 출력이 포함된 모든 것(파일 내용이나 프로그램 출력이 화면에 표시되는 방식을 제어하는 ​​emacs와는 다름)

그래서 당신은 잘못된 트리를 짖는 것입니다. 당신이 원하는 것은 프로그램의 기능입니다보여주다콘솔에 콘텐츠를 넣는 프로그램 중 하나의 출력이 아니라 콘솔에 나타나는 내용의 출력입니다!

따라서 "터미널 열기"라고 말할 때 말하는 프로그램입니다. 시작하는 프로그램(bash)이 아니라 주의해야 할 사항입니다.

어떤 터미널 에뮬레이터를 사용하고 있는지 모르겠습니다. 우리에게 알려줄 기회가 없었습니다. 따라서 gnome-terminal표시된 콘솔 콘텐츠와 키보드 상호 작용 수단을 제공하지 않는다고 추측할 수 있습니다 .

다른 터미널 에뮬레이터를 사용해 보는 것이 좋습니다 alacritty. 사용하는 모든 Linux/BSD, MacOS 또는 Windows에 설치하기 쉬워야 합니다. Unixoids의 우수한 텍스트 편집기 시리즈를 사용할 수 있는 시각적 모드가 있습니다. 터미널에서 실행되는 프로그램에 들어가야 하는 임의의 키 입력을 가로챌 수 없기 때문에 "대화형"과 "시각적" 사이에서 이를 수행해야 합니다. 검사 모드'를 변경해야 합니다.

Ctrl++ Shift를 누르면 Space탐색 모드로 들어갑니다 hjkl. 을 클릭하고 /입력한 ://entern터미널의 URL로 이동합니다. 현재 강조 표시된 링크를 클릭하여 열고, 충분하다면 +를 사용하여 enter모드를 종료하세요.CtrlShiftSpace

답변3

파이프해라...

perl -lne '/((http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-]))/i && print $1' | xclip

답변4

head -n 10 filename | 
  perl -ne 'if (@M = (/\[\[(ht.*?)\]/g) and exists $M[1]) {
              print $M[1]
            }' |
  xsel -i -b

그러면 각 줄에서 두 번째로 일치하는 URL이 추출되어 클립보드에 복사됩니다. 두 개 이상의 URL이 포함된 줄이 여러 개인 경우 모두 클립보드에 복사됩니다. 이를 구분하기 위해 출력에 개행 문자나 탭 등을 추가해야 할 수도 있습니다. printPerl의 -l옵션(즉, 대신 사용 )을 사용하여 perl -lne ...각 파일에 개행 문자를 쉽게 추가 할 수 있습니다 perl -ne ....

두 번째 URL만 필요한 경우첫 번째일치 라인에서 exit첫 번째 성공적인 일치 후에 명령문을 추가하고 인쇄합니다. 예를 들어 Perl 코드를 다음과 같이 변경합니다.

perl -ne 'if (@M = (/\[\[(ht.*?)\]/g) and exists $M[1]) {
            print $M[1];
            exit
          }'

어쨌든 Perl을 사용하여 일치하는 모든 URL을 배열로 캡처한 @M다음 두 번째 요소가 @M있는지 여부를 인쇄합니다(Perl 배열은 1이 아닌 0에서 시작하므로 그게 전부입니다 $M[1]).

Perl은 패턴과 일치하는 모든 하위 문자열을 쉽게 추출할 수 있기 때문에 여기에서는 Perl을 사용하고 있지만 awk나 원하는 다른 언어(또는 도구 파이프라인)를 사용할 수 있습니다.

여기서 중요한 도구는 xselxsel headperlstdin에서 클립보드로 복사하는 도구라는 것입니다. man xsel자세히보다.

관련 정보