2つのパターンの間の(および除外する)行を印刷する


13

cURLを使用してフォームを送信します。ここで、一部のコンテンツは他のファイルから取得され、 sed

param1を使用して他のファイルからのパターンに一致する行の場合sed、以下のコマンドは正常に動作します:

curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit

今、問題に行きます。一致するパターン自体を除く、2つの一致するパターン間のテキストのみを表示したい。

file.txt含まれているとしましょう:

Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.

現在、「beetween 2マッチングパターン」たくさんのsedコマンドが削除されませんfirstmatchsecondmatch

結果を次のようにしたい:

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.

回答:


15

これを行う方法の1つを次に示します。

sed '1,/firstmatch/d;/secondmatch/,$d' 

説明:最初の行からfirstmatchに一致する行までを削除します。secondmatchに一致するから最後の行までを削除します。



5

1行目で発生sedする場合、他のソリューションは失敗しfirstmatchます1

シンプルに保ち、単一の範囲と空の2正規表現
を使用します。範囲の終わりを除くその範囲のすべてを印刷します(自動印刷は無効)3

sed -n '/firstmatch/,/secondmatch/{//!p;}' infile

または、短く、その範囲にないすべてを削除し、範囲の終わりも削除します。

sed '/firstmatch/,/secondmatch/!d;//d' infile


1:理由は 、2番目のアドレスが正規表現の場合、最後の一致のチェックは最初のアドレスに一致した行の次の行から開始されるためです。
したがって、/firstmatch/入力の1行目について評価されることはありません。入力sedされた行番号と一致するため削除1,/RE/され、2行目に進みます。/firstpattern/

2:正規表現は空である(すなわち振舞う最後かのようにREGEX最後のコマンドで使用されるが、(アドレスとして、または代替コマンドの一部としてのいずれかで)適用が指定されました。//sed

3:;}構文は最新のsed実装用です。古いものでは、セミコロンの代わりに改行を使用するか、別の式を使用します。sed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile


//をしているか説明できますか(内部{…})?
G-Manが「Reinstate Monica」と

ありがとう、しかしあなたは私のtrapに落ちた。これ//は、最後に使用された正規表現を意味します。私が読んだすべてのものから、それはあるべきです/secondmatch/。私はあなたのコマンドが機能することをテストで検証したので、/firstmatch|secondmatch/(あなたが確認した)として機能していると結論付けましたが、ドキュメントを見つけることができません(リンクしたPOSIXドキュメントGNUさえも見つかりません)sed manual)この動作について説明しています。…(続き)
Gマンは「Reinstate Monica」と言います

(続き)…楽しい実験:(I)In sed:(1)もしそうなら/first/,4、の//ように振る舞い/first/ます。(2)2,/second/そうすると//、「前の正規表現がありません」というエラーが表示されます。(これは指定された動作に従わない露骨な失敗だと思います。)(3)追加--posixしても上記のいずれも変わりません。(II)他のプログラムの場合:(4)vi、の後/first/,/second/、の//ように動作します/second/(他の形式も文書化されたルールの合理的な実装です)。…(続き)
Gマンは「Reinstate Monica」と言います

(続き)…(5)  awk「最後に使用したRE」の概念がないようです。 //文字の前後の非文字を指します。(試してみてくださいecho -- | awk '{ gsub(//, "cha"); print }'。)
G-Manは「Reinstate Monica」と言います

したがって、「最後のコマンドで最後に使用されたREGEX」を「最後のコマンドで最後に使用されたREGEX」と読み、それが意味することを(正しく)推測しました/first|second/。あなたはラッキーです。これがシステム全体の正規表現の規則ではないことを示すために、他のプログラムに言及します。それをsed追加した人vimは、それを追加することを気にしませんでした。:-)⁠
G-マンは「元に戻すモニカ言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.