sedを使用してUnixでテキストを選択する

sedを使用してUnixでテキストを選択する

テキストファイルの特定の部分を選択して他のファイルに印刷/保存したいです。

特定のパターンが一致すると選択が開始され、他のパターンが一致すると選択が終了します。 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

関連情報