AWKには、行番号ではなく行のテキストに基づいて行範囲を検索するSEDに似た機能がありますか?

AWKには、行番号ではなく行のテキストに基づいて行範囲を検索するSEDに似た機能がありますか?

回避策:ファイルは、LF改行の代わりにCRを使用して保存されます。 Mosvyはこの点を指摘しましたが、回答ではなくコメントのみを投稿したため、原因を特定して問題を解決するのに役立つことを正式に監査することはできません。

mosvyさん、ありがとう。再度来たら、私が親指を立てるように回答を投稿してください。

SEDには以下があるようです。

sed '3,10d;/<ACROSS>/,$d' input.txt > output.txt

(3-10行を削除してから、「<ACROSS>」を含む行からファイルの終わりまで削除し、出力を作成します。)

ただ試しても:

sed '3,10d' input.txt > output.txt

しかし、何らかの理由で私のMacでは、どちらの方法も機能しないようです。

何をもっと試すべきかわかりません。

AWKにも似たようなものがあってほしいです。

修正する:

私が入力したとき:

sed '3,10d' input.txt > output.txt

3~10行は削除されません。ただ、ファイル全体をoutput.txtとして返します。

私が試したとき:

sed '/<ACROSS>/,$d' input.txt > output.txt

Output.txt が空です。

また、私は10.9.4を使用しています。

**アップデート2:

ありがとう、モビー! !ご意見に賛成投票ができたらと思います。これがトラブルシューティングです。

ファイルは、LF改行の代わりにCRとして保存されました。

変換するとすべて解決されましたね。

貢献してくれた皆さんに感謝します。

答え1

/usr/bin/sed '3,10d'私のMac(Mojave)でうまく動作します。それにもかかわらず、awkを使用すると:

awk '(NR >= 3) && (NR <= 10) {next} /<ACROSS>/{exit} 1'

...行番号が3〜10の場合、行をスキップして行が行に達すると<ACROSS>終了します(他のすべての項目は印刷されます)。

答え2

あなたのsedはうまくいきます。それにもかかわらず、Awkにはまだ, --"Between"演算子があります。以下はいくつかの例です(基本ジョブ=印刷)。

「start」と「stop」の間の行を印刷します。

awk '/start/,/stop/'

3号線と10号線の間の路線

awk 'NR==3, NR==10'

<ACROSS>行の間と終わり

awk '/<ACROSS>/, 0'

(0は偽なので終わりません)

答え3

OPの問題は、期待どおりに行終端としてCR\r/ ascii 10)の代わりにLF(/ ascii 13)を使用するファイルが原因で発生します。 usingは、Macを使用していないユーザーとして、クラシックMacOSで使用されるルールです。過去20年間に私が経験した唯一の用途はPDFファイルからです。 in は正規表現にはできません)。\nsedCRperlRSmawkgawk$/perl


タイトルの質問によると、そうです。awkスコープモードがサポートされており、正規表現と行番号の条件付き(またはすべての式)を自由に混合できます。たとえば、

NR==1,/rex/   # all lines from the 1rst up to (and including)
          # the one matching /rex/

/rex/,0   # from the line matching /rex/ up to the end-of-file.

awk最後の述部が範囲を開始する行とも一致できるため、sed範囲は範囲とは異なります。の動作は次のようにシミュレートできます。awksed

s=/start/, !s && /last/ { s = 0; print }

ただし、inの範囲はawk実際には式ではないため、まだ非常に制限されています(否定できず、他の式の一部にすることはできず、inでは使用できませんif(...))。また、これは魔法ではありません。スコープのようなものを表現するために「コンテキスト」を使用する場合(例:)、/start/-4,/end/+4自己循環バッファと追加のロジックをローリングする必要があります。

関連情報