回避策:ファイルは、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 は正規表現にはできません)。\n
sed
CR
perl
RS
mawk
gawk
$/
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
範囲は範囲とは異なります。の動作は次のようにシミュレートできます。awk
sed
s=/start/, !s && /last/ { s = 0; print }
ただし、inの範囲はawk
実際には式ではないため、まだ非常に制限されています(否定できず、他の式の一部にすることはできず、inでは使用できませんif(...)
)。また、これは魔法ではありません。スコープのようなものを表現するために「コンテキスト」を使用する場合(例:)、/start/-4,/end/+4
自己循環バッファと追加のロジックをローリングする必要があります。