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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

1805閲覧

Linuxで行をまたぐ正規表現で削除

yahiro2416

総合スコア8

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2017/11/25 15:22

###前提・実現したいこと
LinuxのRedhatを使ってます。
Sedなどコマンド一つで複数行にまたがる文字列の削除をしたいです。

###発生している問題・エラーメッセージ
下記のような形式な文字列があったとして

---------------sample.txt
aaa123:
a123
b456
c789
bbb456:
a123
ccc789:
b456

aaa123:
a123
b456
c789

この部分だけを削除したいです。

コロンのある行は重複ありません。
タブ先頭の行は重複があるので困ってます。

現在はVIで手動削除しています。

ミスがないようにコマンドで処理したいので
どうぞ宜しくお願いします。

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

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

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

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

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

otn

2017/11/25 17:21

「この部分」とはどの部分でしょうか?「ファイル先頭から最初にc789が出てくるまで」「最初にコロンで終わる行から次のコロンで終わる行の前の行まで」とか色々考えられ、それによって方法が異なります。
otn

2017/11/25 17:24

あと、「タブ先頭の行」とは?
KSwordOfHaste

2017/11/25 23:45

オリジナルの質問文を見ると':'で終わる行以外は先頭にタブがついているようです。
takasima20

2017/11/26 00:41

質問の内容だけみると vi で先頭から4行削除するのが手っ取り早く感じます。間違いが心配なら修正前後の diff とればいいんじゃないかなあ。なんか特別な状況があるのかもしれませんが…
guest

回答2

0

ベストアンサー

awk に変更しました

awk '{if($1~/.+:$/)w=0;if($1~/^aaa123:$/)w=1;if(w==1)next;print$0;}' sample.txt

投稿2017/11/25 15:57

編集2017/11/25 17:01
A.Ichi

総合スコア4070

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

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

KojiDoi

2017/11/25 15:59

それでは題意を満たさないと思います。
A.Ichi

2017/11/25 16:21

確かに、よく読んでおりませんでした大変失礼をいたしました。
KSwordOfHaste

2017/11/25 23:44

A.Ichiさんのアイデアをそのままawkで awk '/:\s*$/ {f=0} /^aaa123:\s*$/ {f=1} !f' sample.txt としても多分よいですよね!
A.Ichi

2017/11/26 00:01 編集

こちらのが方が良いですね。awkは深い。
yahiro2416

2017/11/26 04:40

すごい! ありがとうございました!! そしてなんでこうなるのかいまいちわかりませぬ… もう少し勉強してから実用してみます!
A.Ichi

2017/11/26 04:48

分かる範囲で awkは /検索/{処理}の構成で、2つの条件でfに1,0を代入しています。さらに最後のfが1の時は出力0の時は出力しないを実現していると思われます。ですのでfを逆しにて awk '/:\s*$/ {f=1} /^aaa123:\s*$/ {f=0} f' としても良いと考えます。
KSwordOfHaste

2017/11/26 08:34 編集

必ず':'の行で始まる場合は!fでなくfでもよいですね! ファイルが':'の行で始まらない場合に備えawkの変数のデフォルトがfalseである点に配慮して!fというふうにしていました。CやJavaなど一般の言語と違ってawkみたいなLL的言語のときは「デフォルト状態を強く意識してなるべく簡単に書いてしまう」ことが多い気がします。
A.Ichi

2017/11/26 10:38

その通りです!fの方が良いですね。考えが及びませんでした。
guest

0

perl -ne 'chomp; /aaa123:$/ ... /:$/ and next; print "$_\n"' sample.txt

追記:上のではbbb456:の行まで消えてしまいますね。A.Ichiさんの回答を参考に別解を考えました。

perl -ne 'chomp; /:$/ and $p=0; /aaa123:/ and $p=1; $p or print "$_\n"' sample.txt

投稿2017/11/25 15:53

編集2017/11/25 17:06
KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問