1

ファイル内のm 番目n 番目に一致したパターンの間のすべての行を出力したいと考えています。m が 10 で n が 90 だとしましょう。VIM では次のことを行います。

/pattern  
gg
100n
jdG
gg
10n
kdgg

sed または grep を使用してこれを行うにはどうすればよいですか。ファイルをウィンドウで開かずに操作したい。-c オプションを指定して vimscript を使用しようとしましたが、いくつかの問題が発生しました。ウィンドウでファイルを開かずにvimscriptでこれを行うことはできますか? この部分 (ファイルの切り捨て) をシェル スクリプトの一部として使用したいと考えています。私

4

3 に答える 3

2

1つの簡単な方法:

awk '/pattern/{ count++ } count > m && count < n' input

これは、1つの行で複数回発生する場合、パターンを1回だけカウントしますが、これは簡単に修正でき、その場合にどのような動作を希望するかは明確ではありません。

于 2013-03-07T17:24:53.700 に答える
1

vimscriptこの回答を追加するだけでタグ付けされた質問を見ました。ここに合わない場合はコメントを残してください。削除させていただきます。

vimワークフローは次のように簡略化できます:(たとえばm=3,n=10

/pattern
3//,10//y x|%d|put x
  • vimscriptで必要な場合は、次の関数でラップできます。

    function! CutIt(m,n)
        execute a:m.'//,'.a:n.'//y x|%d|put x'
    endfunction
    

その後、あなたは(後/pattern:call CutIt(3,10)

  • ステップを保存する場合/pattern

    function! CutIt(p,m,n)
        execute a:m.'/'.a:p.'/,'.a:n.'/'.a:p.'/y x|%d|put x'
    endfunction
    

その後、あなたはただ電話します:call CutIt('pattern',3,10)

インタラクティブにやりたい場合。たとえば、マップされたキーを入力pattern, m, nしてから入力Enterし、vimにuのジョブを実行させます。この答え、vimでユーザー入力を受け入れる方法を確認できます: キーを再マップしてユーザー入力を取得します

于 2013-03-07T18:06:27.677 に答える
0
sed '10,90!d' file.txt

STDOUT を含めて 10 行から 90 行までを出力します。出力を新しいファイルに送信するには、次を使用します

sed '1,9!d' file.txt > newfile.txt
于 2013-03-07T17:35:20.267 に答える