1

わかりました、これはトリッキーなものです...私は1つのfile1を持っていて、file1からの特定のテキストだけでfile2を作成したいと思います。

     random useless text 
     #START
     random IMPORTANT text
     #END 
     random useless text

     random useless text 
     #START
     random IMPORTANT text
     #END 
     random useless text

#STARTと#ENDの最初のペア(#を含む)の間にあるテキストを抽出したいのですが、#STARTと#ENDの2番目のペアは無視してください。ペア#START#ENDが同じファイルで2回発生することに注意してください。FIRSTペア(#の記号を含む)の間にあるものが欲しいだけです。

それがすべて言われ、行われた後、私はこのリテラルの結果だけを持つべきです(#START #ENDの最初のペアからのみ:

     #START
     random IMPORTANT text
     #END

別の投稿で誰かが使用しました:

sed -n "/ this is token 1 /、/ this is token 2 / p"

これは、「これはトークン1です」と「これはトークン2です」という1つのペアの文字列を削除する方法でした。

しかし、このsedで「#START」と「#END」を使用すると、#STARTと#ENDの両方のペアが保持されます。

注:最初の#START #ENDの間にあるものは、#START#ENDの2番目のペアの間にあるものとは常に異なります。

4

2 に答える 2

5

私は awk を使用します:

awk '/#START/{flag=1} flag{print} /#END/{exit}' your_file

説明:

  1. 現在のレコードが開始トークンを含む正規表現と一致する場合にフラグを設定します。
  2. フラグが設定されている場合、現在のレコードが出力されます
  3. レコードが終了トークンと一致する場合、プログラムはそのまま存在するため、2 番目のコピーは処理されません

: 複数の awk ルールを 1 つのレコードに適用できます。 また、注意: タスクによっては、レコードセパレーターRSと出力レコードセパレーターを調整する必要がある場合がありますORS。次に例を示します。

gawk -v RS='[[:space:]]+' -v ORS=' ' '/#START/{flag=1} flag{print} /#END/{exit}'

これにより、レコード区切り文字が任意の数の空白文字に設定され、出力レコード区切り文字がスペースのみに設定されます。したがって、トークンは空白で区切られており、余分な情報が出力されることはありません。たとえば、そのような入力で最初のバージョンとこのバージョンを比較します。

blahblahblah #START
important text
#END blah blah blah
fdsfs

gawk必要に応じて、公式のリファレンス マニュアルを参照してください:リンク

于 2012-08-11T02:01:56.763 に答える
2

これはあなたのために働くかもしれません(GNU sed):

sed '/#START/,/#END/!d;/#END/q' file

説明:

  • /#START/,/#END/!d#STARTとの間にないものはすべて削除(印刷しない)し#ENDます。#STARTこれはとの間でのみ印刷されます#END
  • /#END/q終了しますが、遭遇したときに印刷します#END
于 2012-08-11T07:34:16.950 に答える