質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

1回答

1828閲覧

.txt内の指定文字の次の行から指定文字の前の行まで抽出したい(以下に例を提示します)

退会済みユーザー

退会済みユーザー

総合スコア0

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2018/10/02 03:57

編集2018/10/02 04:45

前提・実現したいこと

お疲れ様です。
タイトルの通り、
.txt内の「指定文字の次の行から指定文字の前の行」まで抽出して
.shの変数に値を入れたいと考えています。
sedやawkを使うことで達成できるかと思っているのですが、
指定文字の「次の行」や「前の行」という表現が分からずこちらについて伺わせてください。

発生している問題・エラーメッセージ

同上

該当のソースコード

.txtの例です。例えば、指定文字[家電]の次の行から[列車]の前の行(=冷蔵庫、洗濯機)を抽出したいと考えています。

[食べ物] りんご さかな カレー [家電] 冷蔵庫 洗濯機 [列車] 東海道 山手線

試したこと

sedやawkのコードを調べていく中で、
cat ◯◯.txt | awk '/START/,/STOP/' | sed ~
こういったものが近いのかなと思いつつもSTARTの次の行から
指定するにはどうしたものかと考えています。
ご教授のほどよろしくお願いいたします。

また、情報が至らない場合にはご指摘いただけると幸いです。

補足情報(FW/ツールのバージョンなど)

「編集・追記依頼」に対する回答
家電→列車の順で書かれてますが、1つ目を「列車」2つ目を「家電」のように指定することはありますか?
⇒ない想定です。
また、1つ目を「食べ物」2つ目を「列車」のように家電を抜かすような場合はありますか?
⇒こちらについてもない想定です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dice142

2018/10/02 04:20

いくつか疑問なのですが、「指定文字は2つでそれぞれ任意の指定文字を指定なのか、それとも1つだけで次の指定文字までなのか」、「指定文字が2つの場合順番は考慮するのか」、「指定文字が2つの場合指定文字が連続ではない可能性はあるのか」などはどうなっていますか?
退会済みユーザー

退会済みユーザー

2018/10/02 04:28 編集

返信ありがとうございます。 「指定文字は2つでそれぞれ任意の指定文字を指定なのか、それとも1つだけで次の指定文字までなのか」 ⇒指定文字は2つで、指定文字については.shのこの箇所では[家電]~[列車]を抽出するようなこちらから指定する形を取る予定です。 「指定文字が2つの場合順番は考慮するのか」、「指定文字が2つの場合指定文字が連続ではない可能性はあるのか」 ⇒こちらについては私の理解力に問題があり、いまいちお答え出せないのですが最初のものに対する回答で答えになりますでしょうか。
dice142

2018/10/02 04:40

たとえば、家電→列車の順で書かれてますが、1つ目を「列車」2つ目を「家電」のように指定することはありますか?また、1つ目を「食べ物」2つ目を「列車」のように家電を抜かすような場合はありますか?こちらでは他の方が見ない可能性があるので質問文に追記お願いします。
guest

回答1

0

ベストアンサー

先頭から文字列1まで、文字列2から末尾までを削除します。

Bash

1sed '1,/[家電]/d;/[列車]/,$d'

投稿2018/10/02 04:25

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/02 05:00

回答ありがとうございます。 上記のコードで試してみたところ、 抽出でなく削除ではありますが「冷蔵庫」「洗濯機」の箇所を特定できているようでした。 抽出についてはこちらで一度調べてみようと思います。ありがとうございます。
otn

2018/10/02 05:06

「抽出」と「削除」という言葉ををどう使い分けていますか? ABC → B これは「抽出」ですか?「削除」ですか?
退会済みユーザー

退会済みユーザー

2018/10/02 05:12 編集

>ABC → B A, Cが.txtから消していないなら抽出という認識でいます。 理解不足で申し訳ないです。 こちらは削除?対象が「冷蔵庫」「洗濯機」なのか、 削除?結果が「冷蔵庫」「洗濯機」だけ残る、 どちらになるのでしょうか。。
otn

2018/10/02 05:13

Bの抽出と、AとCの削除は同じことです。
退会済みユーザー

退会済みユーザー

2018/10/02 05:15

sed -iで上書きして確認してみたところ、「冷蔵庫」「洗濯機」だけが残るという認識ですね。 「冷蔵庫」「洗濯機」以外の.txt内容自体はそのままで「冷蔵庫」「洗濯機」を選択するという想定でした。
otn

2018/10/02 05:15

> 削除?結果が「冷蔵庫」「洗濯機」だけ残る、 ですね。 「冷蔵庫」「洗濯機」以外が削除対象です。
otn

2018/10/02 05:18

「選択する」とは?「抽出」とは別ですか? 元のファイルをそのままにしたいのに何故-iを付けるのか分かりません。
退会済みユーザー

退会済みユーザー

2018/10/02 05:21 編集

これ上書きしないで「冷蔵庫」「洗濯機」を変数に代入すれば、 .txtはそのままで「冷蔵庫」「洗濯機」を選択(抽出)できているという認識で合ってますでしょうか? >元のファイルをそのままにしたいのに何故-iを付けるのか分かりません。 こちらについては削除?対象が「冷蔵庫」「洗濯機」なのか、削除?結果が「冷蔵庫」「洗濯機」だけ残るのかを確かめるためにこちらで実験したためです。なので、こちらについては気にせずで問題ありません。
otn

2018/10/02 05:24

> これ上書きしないで「冷蔵庫」「洗濯機」を変数に代入すれば、 .txtはそのままで「冷蔵庫」「洗濯機」を選択(抽出)できているという認識で合ってますでしょうか? 合ってます。 > 確かめるためにこちらで実験 -i は、出力された物で元ファイルを置き換えるオプションですよ。
退会済みユーザー

退会済みユーザー

2018/10/02 05:36

上記、承知いたしました。 懇切丁寧に教えていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問