テキストファイルの特定の部分を選択して他のファイルに印刷/保存したいです。
特定のパターンが一致すると選択が開始され、他のパターンが一致すると選択が終了します。 awkなしでこれを行う必要があります。 sedを使用しようとしています。
- 見つかったら選択を始めてください。予想される
- 見つかるまで実際
> |e|build_event_details_json(e) })
expected collection contained: [{"id"=>18646, "state"=>"available", "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",actual collection contained: [{"id"=>18646
答えは
> expected collection contained: [{"id"=>18646, "state"=>"available", "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
答え1
非常にエレガントでも効率的でもありませんが、作業を完了します。
sed 's/actual/\n&/' file | sed -n '/expected/,/actual/p' | sed '$d'
expected collection contained: [{"id"=>18646, "state"=>"available", "salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
多分少し良いかもしれません(GNUを使用sed
):
sed -n '/expected/,$ {s/actual.*$//; p; T; q; } ' file
このT
コマンドが利用できない場合は試してください。
sed -n '/expected/,$ {s/actual.*$//; p; tL; b; :L; q; } ' file
答え2
ちょうどsedを使用してください:
<infile sed 's/expected/\n&/;s/.*\n//;s/actual/\n&/;s/\nactual.*//'
説明する:
s/expected/\n&/
前に改行(区切り)を入れてくださいexpected
。s/.*\n//
前のコマンドで生成されたガイドラインを削除します。s/actual/\n&/
前に改行(区切り)を入れてくださいactual
。s/\nactual.*//
で始まる上記で生成された行を削除しますactual
。
actual
上記は、行の先頭にある場合は空行を生成します。空白行を避けるには、以下を使用してください。
<infile sed 's/expected/\n&/;s/.*\n//;/^actual/d;s/actual.*//'
また、上記のコマンドは、一致または一致しないすべての行を変更せずにそのままにして印刷されることに注意してexpected
くださいactual
。
これを防ぐには、/expected\|actual/!d
前に次を追加してください。
<infile sed '/expected\|actual/!d;s/expected/\n&/;s/.*\n//;/^actual/d;s/actual.*//'
必要なものがあれば範囲expected
との間の行をactual
削除し、含まれている末尾の行を削除してactual
から、次を使用します。
<infile sed '/^expected/!{s/expected/\n&/};/^actual/!{s/actual.*/\n&/}' |
sed '/expected/,/actual/!d;/actual/d'
答え3
私はこれが次のようになるべきだと思います。
sed -n '/expected.*actual/{s/actual.*//;p;n};
/expected/,/actual/{s/actual.*//;p}' input
行に開始タグと終了タグの両方が含まれている場合、終了タグの後のすべての内容が削除され、次の行が読み取られます。それ以外の場合は、開くタグと閉じるタグを含む行の間に何かを印刷し、閉じるタグの後ろのすべてを再度削除します。
答え4
sedを使用してJSONを解析したいようです。これは良い考えではありません。使用ジャック可能であれば。
それにもかかわらず、ファイル全体をメモリに入れ、検索して置き換えることができます。
$ cat file
foo
bar
> |e|build_event_details_json(e) })
expected collection contained: [
{"id"=>18646,
"state"=>"available",
"salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
actual collection contained: [
{"id"=>18646
baz
qux
$ sed -n 'H;${g;s/.*\(expected.*\)actual.*/\1/p}' file
expected collection contained: [
{"id"=>18646,
"state"=>"available",
"salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
から変更されるので参考にしてください最後「期待する」最後*
数量化貪欲のために「実際」に従う
$ cat file
foo
expect1
bar
> |e|build_event_details_json(e) })
expected collection contained: [
{"id"=>18646,
"state"=>"available",
"salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
actual collection contained: [
{"id"=>18646
baz
actual2
qux
$ sed -n 'H;${g;s/.*\(expected.*\)actual.*/\1/p}' file
expected collection contained: [
{"id"=>18646,
"state"=>"available",
"salesEndAtUtc"=>"2018-09-22T00:00:00.000Z",
actual collection contained: [
{"id"=>18646
baz