2つの文字列の間にテキストを印刷する - 2番目の発生を無視する

2つの文字列の間にテキストを印刷する - 2番目の発生を無視する

複数の手順を含む指示ファイルがあります。グラフィック環境なしでシェルで必要な個々のステップを見たいです。あなたが言ったように、今私がしていることはアレモアsed表示するステップ番号と次のステップ番号内の内容を抽出するために使用されます。

cat file | sed -n '/12/,/13/p'

ステップ12:他のものステップ
commands to execute
13:他のもの

私が望むように正確にやりたいのは、最後の行を省略することです。sedつまり、最初の項目から2番目の項目まで印刷することです。 2行目を避け、出力から最後の行を削除して印刷したいです。

ステップ12:いくつかのこと
commands to execute

これを達成するには、コマンドをどのように変更する必要がありますか?追加のコマンド、パイプなどが欲しくない。可能であれば、「1つは印刷し、もう1つは省略」など、最初のパターンを2番目のパターンと区別するために使用法を変更しますsed(または同様に、単に他のツール(たとえば)を使用)。grep

そして命令もできるだけ簡単に作って簡単に覚えて、短時間で書き出すことができるようにしたいと思います。

答え1

Don_crisstiがコメントで解決策を提示しました。 (彼の文書に従ってください。)命名規則):

sed -n '/12/,/13/{/13/!p}' UUoC.txt

これにより、12ファイルの1行から1行までのすべての行が選択され、一致しない限り印刷されます(それはすべてです)。13UUoC.txt13/13/!p

もう1つの方法は、head次を使用して最後の行を削除することです。

sed -n '/12/,/13/p' file.txt | head -n -1

答え2

don_crisstiとterdonはすべての努力を傾けました。私はこの質問を見て、タイピング/暗記をさらに減らし、柔軟性を追加するためにシェル機能を使用することを提案したいと思いました。また、誤った肯定を避けるために、入力中にいくつかの正規表現を自由に調整することができました。

シェル関数は次のとおりです。

function step () (
  STEPS=./steps.txt
  start=$1
  stop=$((start+1))
  sed -n "/^Step $start:/,/^Step $stop:/ { /^Step $stop:/ !p }" $STEPS
)

step明らかに、文書の表現に応じて、必要に応じて名前を付けることができます。私の考えでは直感的なようです。このようにして変数を実際のディレクティブファイルのフルパスに調整すると、STEPSそれを覚えたり入力したりする必要はありません。 - コマンドライン上のファイルへのパス。 STEPS、開始変数と停止変数でシェルの名前空間を汚染したくないため、関数はサブシェル(中括弧ではなく本文の周りに括弧)を使用するようにしました。サブシェルの作成が3つの新しい変数を作成するよりも面倒な場合は、2番目の角かっこセットを中かっこに自由に変更してください。

私はdonとterdonに使用する正規表現で2つの基本的な操作を行います。

  1. 試合がラインの先頭から始まるように強制し、
  2. 「ステップ」という単語、数字、コロンを含める必要があります。

commands to executeディレクティブファイルに数字が含まれており、正規表現の不一致がより簡単になる可能性があると思ったので、これらの両方を実行しました。

私が使用する "Devil's Advocate" steps.txt ファイルは次のとおりです。

Step 1: one
commands to execute
Step 2: two
commands to execute
commands to execute
Step 3: three
commands to execute skip to Step 7
Step 4: four
commands to execute not step 5
commands to execute
commands to execute
commands to execute
Step 5: five
commands to execute
commands to execute
commands to execute skip to Step 6:
commands to execute
Step 6: six
commands to execute
Step 7: seven
commands to execute
Step 8: eight
commands to execute
Step 9: nine
commands to execute
Step 10: ten
commands to execute
Step 11: eleven
commands to execute
Step 12: something
commands to execute
commands to execute
Step 13: something else
commands to execute

...そしてテストハーネスの結果(出力はstep 14空です):

$ for step in $(seq 1 14); do step $step; echo; done
Step 1: one
commands to execute

Step 2: two
commands to execute
commands to execute

Step 3: three
commands to execute skip to Step 7

Step 4: four
commands to execute not step 5
commands to execute
commands to execute
commands to execute

Step 5: five
commands to execute
commands to execute
commands to execute skip to Step 6:
commands to execute

Step 6: six
commands to execute

Step 7: seven
commands to execute

Step 8: eight
commands to execute

Step 9: nine
commands to execute

Step 10: ten
commands to execute

Step 11: eleven
commands to execute

Step 12: something
commands to execute
commands to execute

Step 13: something else
commands to execute

関連情報