• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:再びLinuxでテキストファイルの改行を解除)

再びLinuxでテキストファイルの改行を解除

このQ&Aのポイント
  • Linuxでテキストファイルの改行を解除する方法を教えてください。
  • awkコマンドを使用してテキストファイルの改行を解除する方法について質問です。
  • テキストファイルの改行を解除したい場合、awkコマンドを利用する方法があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

> それぞれの行の間で、空白行が一つのみ、二つ以上の空白行が連続している、 > のどちらでも同じ結果が返ってくる、ということになります。 そういう前提があるなら cat -s でフィルタすればいいじゃん、と解答しようとしましたが、サンプルデータの最後見るとそれだけでは駄目みたいですね。面倒でもそういう仕様は全部最初に書いておいてください で考えてみましたが結果こうなればいいんですか?なんか行頭のインデントが不自然ですが、削除するのかこちらでは判断できません sed -E ':1;N;$!b1;s/\n+([  ]+)/\n\1/g;s/\n{3,}/\n\n/g;s/\n([^\n  ])/\1/g' /tmp/sample ここからがサンプルデータ。A new paragraph  ここも新段落で、こっちはただの改行。 ここは一つ空白行はさんだ。 二つ空白行はさんでおいて、http://www.google.com  ここも一つ空白行はさんだ。

noname#214079
質問者

お礼

ありがとうございます。 > そういう前提があるなら cat -s でフィルタすればいいじゃん、と解答しようとしました 知りませんでしたが、cat -s で連続する空白行を一行のみにできるのですね。勉強になりました。 > 面倒でもそういう仕様は全部最初に書いておいてください そうですね、すみません。 これくらいで分かるだろう、という感じで質問を書いちゃうことが多いもので。 > なんか行頭のインデントが不自然ですが、削除するのかこちらでは判断できません 行頭のインデントは削除せずにそのままにしておいた方がいいです。 それと、回答No.1のお礼コメント欄で A new paragraph(ここも半角インデントを5個入れた) の部分は半角インデントを行頭に入れたのに、こう表示されちゃいます。 OKWave の仕様か、Firefox の NoScript の影響か分かりませんが。 > sed -E ':1;N;$!b1;s/\n+([  ]+)/\n\1/g;s/\n{3,}/\n\n/g;s/\n([^\n  ])/\1/g' /tmp/sample これで全角または半角のインデントについては望みどおりの結果が得られるようですが、 その他の処理は同一で、空白行を削除せずそのままにしておくことはできますでしょうか? 空白行を削除するには後で cat output.txt | sed '/^$/d' とやればできるようですので。 教えていただいた構文について できれば中身の文法も理解して、自分で応用できた方がいいのですが、 やはり sed や awk は専門外の人間には少し難しいです。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

> これくらいで分かるだろう、という感じで質問を書いちゃうことが多いもので。 いやあ、如何に手早く、というか手抜きするかいつも考えてるもので… > A new paragraph(ここも半角インデントを5個入れた) > の部分は半角インデントを行頭に入れたのに、こう表示されちゃいます。 OKWave の仕様ですね。もう少し専門的な掲示板ではコードの貼り付け機能あるとこもあります。 > その他の処理は同一で、空白行を削除せずそのままにしておくことはできますでしょうか? それなら置換一つで sed -E ':1;N;$!b1;s/([^\n])\n([^\n  ])/\1\2/g' /tmp/sample > できれば中身の文法も理解して、自分で応用できた方がいいのですが、 なにも解説してなかったので簡単に説明しておくと、 :1;N;$!b1; eof まで読み込みます。$が最終行 !がその否定で、最後の行でなければ b1 で :1 にジャンプして N で次行読み込みの繰返し。ですから巨大なファイルとか非力なシステムだと問題になるかもしれませんが、通常のテキストファイルでは差し支えないでしょう。万一問題ある場合は最初の awk の樣に逐次処理に落し込む必要があります。 最後にまとめて置換、 s/\n+([  ]+)/\n\1/g; サンプルの最後のケース s/\n{3,}/\n\n/g; 連続する空行を一つに s/\n([^\n  ])/\1/g 改行の直後が改行と空白*以外*なら最初の改行を削除 ちなみに \n が改行 \1 や \2 は () に相当、他の正規表現は調べてください

noname#214079
質問者

お礼

たびたび回答いただき、さらに解説までつけていただきまして、本当にありがとうございます。 > sed -E ':1;N;$!b1;s/([^\n])\n([^\n  ])/\1\2/g' /tmp/sample 確かにこれで空白行もそのままの処理ができるようですね。 awk や sed、正規表現の世界は奥が深そうですね。 きっちり修得すると、かなりレベルアップしそうです。

すると、全ての回答が全文表示されます。
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

サンプルデータ用意してくれると簡単なのですが、 sed ':1;N;$!b1;s/\n\([^\n  ]\)/\1/g' input.txt > output.txt \n の直後の空白は半角全角の二文字です。それかあんまり仕様把握してないが sed ':1;N;$!b1;s/\n\([^\[:space:]]\)/\1/g' input.txt > output.txt でもいいのかもしれない

noname#214079
質問者

お礼

ありがとうございます。 両方試してみましたが、だいたいはうまくいくようです。 サンプルデータは以下のようなものです。 たびたび申し訳ないのですが、 空白行を削除する、削除しないが それぞれに統一された動作をするもの(なので2種類)を示していただけるとありがたいです。 それぞれの行の間で、空白行が一つのみ、二つ以上の空白行が連続している、 のどちらでも同じ結果が返ってくる、ということになります。 ここからがサンプルデータ。 A new paragraph  ここも新段落で、 こっちはただの改行。 ここは一つ空白行はさんだ。 二つ空白行はさんでおいて、http://www.google.com  ここも一つ空白行はさんだ。

すると、全ての回答が全文表示されます。

関連するQ&A