-F オプションとパターンマッチングを使用した less

-F オプションとパターンマッチングを使用した less

スクリプトから、lessファイルを呼び出して、新しい画面ではなくコンソールに出力を印刷するようにします。ファイルが 1 つの画面に収まるほど短い場合は、スクロールを無効にします。ファイルが 1 つの画面より長い場合は、スクロールできるようにし、一番下までスクロールしたらlessコンソールに制御を戻します。行も切り詰める必要があります (この場合、コンソール ウィンドウを超えた文字列の末尾が失われても問題ありません)。

また、特定のパターンを強調表示したいと思います。

引数に使用しているのは以下のものです:

less -SFXE -p "ccc" fileToShow.txt

テキストがコンソールより長くてスクロールが必要な場合には、長い行を-S切り詰めたり、-FXファイルの行数がコンソールより少ないかどうかを検出してスクロールせずにすべてのテキストをコンソールに出力したり、ファイルの末尾に到達したら終了したりするために使用します-Eless

-p一致を強調表示するスイッチを追加するまでは、これらはうまく機能します。

fileToShow.txt に次の内容が含まれているとします。

aaa
bbb
ccc
ddd
eee

パターンスイッチがない場合、次のようになります。

[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $ 

パターン マッチングを追加すると、less はコンソールの高さまで空の行を出力します (空の行を表示するためにチルダを使用します)。

[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $ 

-pスイッチを使用して、使用時に空の行を表示しないようにする方法はありますか-F? (注: 「ccc」行は希望どおりに強調表示されますが、これは意図しない副作用です。)

私のシェルは でbash 3.2.25、less バージョンは です436。OS は RHEL です。

答え1

次のコマンドはバッチ ファイルにカプセル化できます。

 grep --color=always -E "^|$2" "$1"|less -SFXER

パラメータは$1ファイル名であり、$2検索パターンです。注意点:

  • grep -E(またはegrep)複数の検索パターンに一致できます。
  • (行の先頭)に一致させることで^、すべての行がリストされることが保証されます。
  • 一致すると$2検索文字列が強調表示されます。
  • grep --color=always強調表示されたエスケープ シーケンスをパイプにコピーします。
  • less -Rlessエスケープシーケンスを表示する代わりに、ハイライトを再現します。

これは最もすっきりした解決策ではありませんが、ある種の答えです。 コマンドはすべての行をリストし、パターンを強調表示しますが、 はless -p最初の一致より前の行を省略することに注意してください。これを再現するには、 を使用する必要がありますsed

答え2

オールインという別の方法もありますless。ただし、いくつかの手順が必要です。

  1. less fileToShow.txt
  2. ヒットします&ccc(ccc探しているパターンであると仮定します)。man ページから:

    &pattern: Display only lines which match the pattern; lines which do not match the pattern are not displayed. If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed. While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden. Certain characters are special as in the / command: ^N or ! Display only lines which do NOT match the pattern. ^R Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

  3. 最後に、F押すと追跡が再開されます

答え3

完全な解決策ではありませんが、いくつかの改善点があります-p...
これらは、柔軟な+フラグに依存しています。

コマンドラインオプションが で始まる場合+、そのオプションの残りの部分は、少ない例えば +G少ない は、ファイルの先頭ではなく末尾から開始し、+/xyzファイル内で最初に出現する "xyz" から開始するように指示します。特別な場合として、+<number>は のように動作します+<number>g。つまり、指定された行番号から表示を開始します (ただし、上記の "g" コマンドの警告を参照してください)。オプションが で始まる場合 ++、最初のファイルだけでなく、表示されているすべてのファイルに初期コマンドが適用されます。 + 前述のコマンドを使用して、すべてのファイルの初期コマンドを設定 (または変更) することもできます。

-p最初の一致にスキップします ( を使用する場合は、その数行前--jump-target)。これは、短い場合に終了することと組み合わせて使用​​​​したいものではありません。スキップされた行は、ターミナルのスクロールバックでさえありません。

  1. 起動してless対話的に検索すると/ccc、lessは最初に行を先頭から表示し、その後スクロールするので、だろう端末のスクロールバックバッファの一部になります。これをエミュレートするには+、次のように明示的に再描画を要求する必要がありますr

    env LESS= less -SFXE +r/ccc fileToShow.txt
    

    これはまだccc行までスクロールしますが、aaa少なくともbbbスクロールバック バッファ内にはあります。ただし、検索で多数の行がスキップされる場合は、次のようになります。

    seq 1000 | less -SFXE +r/980
    

    スクロールバックには次のような内容が表示されます:

     48
     49
     50
     ...skipping...
     980
     981
     982
    

    これは によって調整可能だと予想していました--max-back-scrollが、検索には影響しないようです。編集: ウィンドウのサイズに依存するようです。つまり、1 つの画面を埋めてからスキップします。

  2. 最初の行を見たくないなんて誰が言ったのでしょうか? 一致のみを強調表示したい場合は、空一致のトリックを使用できます。

     less -SFXE '+r/ccc|$' fileToShow.txt
    

    nしかし、これは/によるナビゲーションを中断します。検索Nではこのフラグを使用する方が適切です。/

    特定の文字は、パターンの先頭に入力すると特殊となり、パターンの一部になるのではなく、検索の種類を変更します
    。...

    • ^K 現在の画面上のパターンに一致するテキストを強調表示しますが、最初の一致には移動しません (現在の位置を保持)。

    charを含める構文はCtrl+Kシェルによって異なりますが、bash では次のように機能します。

     less -SFXE $'+r/\cKccc' fileToShow.txt
    

    ~いずれにしても、最初の行から始めると、画面を埋める回数も減ります。

関連情報