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)

2つのリンクは7行の中央にあり、1行にだけではなくテキストで囲まれています。

今クイズの質問は次のとおりです。 URL#2をメモリにコピーして、マウスを使わずに他のプログラムに貼り付けることができるようにするにはどうすればよいですか?

GNU Emacsで?非常に簡単:「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とは異なります)

だからあなたは間違った木を吠えることです。あなたが望むのはプログラムの機能です見せるコンソールにコンテンツを入れるプログラムの1つの出力ではなく、コンソールに表示されるコンテンツの出力です!

したがって、「ターミナルを開く」と言うときに話すプログラムです。始まるプログラムではなく、注意すべきことです。

どの端末エミュレータを使用しているのかわかりません。私たちに知らせる機会はありませんでした。したがって、gnome-terminal表示されたコンソールコンテンツとキーボードの対話手段を提供しないと推測できます。

別のターミナルエミュレータを使用することをお勧めしますalacritty。使用するすべてのLinux / BSD、MacOS、またはWindowsにインストールするのは簡単です。 Unixoidsの優れたテキストエディタシリーズを使用できるビジュアルモードがあります。端末で実行されているプログラムに入る必要がある任意のキーストロークを傍受することはできないため、「対話型」と「ビジュアル」の間でこれを行う必要があります。検査モードを変更する必要があります。

Ctrl++Shiftを押すとSpaceナビゲーションモードに入りますhjkl。をクリックして入力し、/端末のURLに移動します。現在強調表示されているリンクをクリックして開き、十分な場合は+を使用してモードを終了してください。://enternenterCtrlShiftSpace

答え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

これにより、各行から2番目に一致するURLが抽出され、クリップボードにコピーされます。複数のURLを含む行が複数ある場合は、すべてクリップボードにコピーされます。これを区別するために、出力に改行文字やタブなどを追加する必要があるかもしれません。printPerlの-lオプション(つまり代わりに使用)を使用して、perl -lne ...各ファイルに改行文字を簡単に追加できますperl -ne ...

2番目のURLのみが必要な場合最初一致行でexit最初の成功した一致の後に文を追加して印刷します。たとえば、Perlコードを次のように変更します。

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

とにかくPerlを使用して、一致するすべてのURLを配列としてキャプチャし、2番目の要素があるかどうかを@M印刷@Mします(Perl配列は1ではなく0から始まるので、これはすべてです$M[1])。

Perlはパターンに一致するすべての部分文字列を簡単に抽出できるため、ここではPerlを使用していますが、awkや他の言語(またはツールパイプライン)を使用できます。

ここで重要なツールは、xselxselheadperlstdinからクリップボードにコピーするツールです。man xsel詳細より。

関連情報