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

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

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

http://okwave.jp/qa/q8956601.html での質問の内容ですが、さらなる回答がつきにくいようですので、再質問とします。 awk '(/^.+$/){printf("%s",$0)}(/^$/){print}' < input.txt > output.txt で前の行との間に空白行をはさむ箇所のみ改段落とみなして段落変更をそのままにする、 という処理はできました。 さらに、前の行との間に空白行をはさんでおらず行頭で全角または半角のインデントがされているのみ、 の段落変更の部分も改行を解除せずに段落変更がされた状態を保ち、 残りの箇所のみ改行を解除するためにはどうすればよろしいでしょうか? どうぞよろしくお願いいたします。

noname#214079
noname#214079

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

  • ベストアンサー
  • 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

  • word 2010 改行 右に1つずれてる感じ

    添付ファイルの画像をつけましたが、わかりにくいかもしれません。 あるファイルでenterを押すと1つ右にずれた感じになり(と言っても1文字分入れられる空白ではないです) そして次からの行では1つ改行記号がずれた感じになり、「文字を入れると1行空いて次の行に入力されてしまいます。 何かの設定がかかっているのでしょうか? ネットで調べたらインデントかと思いましたが、 >書式→段落→インデントと行間隔の中の「インデント」で調整する では解決しませんでした。 ページ設定→行数 も問題ないです 「インデントと行間隔」で「段落前」と「段落後」も0です

  • バッチファイルで改行の出力

    バッチファイルで,改行のみをファイルに追記したいのですがどのようにすればできますか? echo >> output.txt とすると「ECHO は <OFF> です。」と出力されてしまいます. 全角を出力すれば見た目は同じですが,純粋に改行のみの出力方法をお願いします.

  • 助けて下さい!! ワードファイルの修正

    以下二つのワードファイルの修正をしています。  Aファイル:問題集  Bファイル:Aの問題集の回答および解説 基本的には同じ文章で構成され、Bには回答と解説が補足されています。 この二つのファイルの  1.語句の修正  2.行頭を揃える 等の修正です。それぞれ同じような内容に修正していくのですが 条件としてはA、Bの文章の文字列が行頭・行末とも 一字たりとも違えないように、まるきり同じ状態になるように、とのことです。 それぞれの行末の文字が違えば「インデント」を使ったりして 揃えるようにしていたのですが ところどころでA,Bの書式が異なるようで どうしてもA,Bの書式が崩れてしまいます。   例 ・インデントはA、B同じなのに一行の文字数が異なる   ・改行すると「段落番号」の書式が崩れ、段落番号とその後に続く   文字列のあいだのスペースの広さが変わってしまう など。 また、分の途中で「エンターキー」で改行している箇所もあれば 改行をせずに一段落としている箇所もあるので インデントを使うと更に崩れたりします。 長くなってしまいましたが 今回お願いしたいのは「効率よく修正する方法」があれば 教えていただきたいのです。 60ページのファイル×2で、締め切りもありますので困っています。 行末の文字を揃えるために、書式を崩さぬよう仕方なく 「シフトキー+エンターキー」で段落を変えぬまま改行したりしている状態です。スマートに解決する方法があれば教えてください。 OSはワード2000です。 説明等不足箇所は補足しますのでお願いします。

  • バッチでテキストを出力したときに改行ができない

    バッチファイルでテキストを出力するのですが、改行ができません echo 一行目 > C:\temp.txt ? echo 二行目 >> C:\temp.txt として結果C:\temp.txtファイル内に  一行目  二行目 ではなく  一行目  二行目 としたいのですが、、 ?にはいるものがわかりません。 echo " " >> C:\temp.txt としても""が入ってしまうし echo   >> C:\temp.txt (全角スペース)を入れても"ECHO は <ON> です。"とメッセージが出てしまいます。 わかる方お願い致します。

  • 改行を読み飛ばす

    以下のようなファイルを読み込みたいのですが…. -------------------------------------------------- あいうえを かきくけこ さしすせそ たちつてと -------------------------------------------------- のように1行文字列があって,1行空白行(改行のみ)があって…のような繰り返しのファイルなんですが,空白行を読み飛ばして続けて -------------------------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------- のように表示させる場合はどのように書いたらよいですか? -------------------------------------------------- while(fgets(str,256,fpin)){   if(strcmp(str,"\n")!=0){    printf("%s\n",str);   } } -------------------------------------------------- と書いたのですが,空白行も表示されてしまいます. 何か間違えているでしょうか? それとも実はファイルの空白行は改行じゃないとかでしょうか?

  • word文書の段落間隔

    wordの段落間隔を狭めたいのです。 同じ段落で文章を続けた時の行と行の間隔と、改行前後の行と行の間隔が違います。 改行するとそのまま文章を続けた時よりも間隔が空いてしまうのです。 書式→段落→インデントと行間隔→間隔の段落前と段落の欄を0行に、行間を1行にはしましたが、変化ありません。 ただ、変更しOKをクリックした後、再び書式から段落を開くと、段落前、段落後の欄、行間は空白に戻ってしまっています。 改行前後の間隔も文章をそのまま続けた時と同じ間隔にしたいのですが、どうしたら、よろしいでしょうか? 文章には画像、グラフも含まれます。

  • 一太郎2008 でテキストファイルを開くと、ある条件で文字が置き換えられます

    これまで Word をちらほら使ってました。乗り換え版だと ATOK 単体と価格差が それほど無かったので、一太郎2008 を購入しました。先ほど使っていてあることに 気づきました。 1(改行)2(改行)3(改行)1(改行)2(改行)3(改行) [ 数字と改行の間に文字が入っても構いません。というか普通の文章では入るでしょう。 ] などと行頭に全角で数字が入っているテキストファイルを開くと、勝手に 1(改行)2(改行)3(改行)4(改行)5(改行)6(改行) と数字が置き換わってしまいます。しかも置き換えるかどうかの警告は見られません。 さらに置き換えられてしまった文をセーブすると、置き換えられた方の文でセーブ されてしまいます(当たり前かな?)。たとえその勝手に置き換えられた数字以外は、 一切内容を変更していなくても。行頭に全角数字を使った人が悪いのかもしれませんが。 ほかにも勝手に書き換えられる可能性があるのかと思うと、恐くて使えなくなって しまいました。Word も文書作成中、勝手に箇条書き番号を付け始めることなどは ありましたが、テキストファイルオープン時に内容を変えることは無かったように 思います。確信はありませんけど。 一太郎ではこれは今までも見られたことなのでしょうか。それとも自分最初に設定を ちょこちょこ触ってしまったので、何かおかしな設定をしてしまった可能性が 高いのでしょうか。

  • ワークシートの内容をテキストファイルに書き込む際に、テキストファイルでは改行が”↑”と表示されるだけで困っています

    エクセルのデータをテキストファイルに出力させたいのですが、テキスト出力の際に"↑"が表示されるだけで改行がうまくできません。 マクロの組み方でアドバイスをいただけないでしょうか? ------------------------------ <↓具体的に、、、、。> ・エクセルデータは、同一セル内に改行させたデータがあります。      列A   列B   行1 No,1  1-111111              1-1111       行2 No,2  2-2222    ←セル"B1"と"B2"のデータを     2-22222    テキストでも改行させて表示したい。 ・テキストでは、下記のように出力させたい ◆No,1 1-111111 1-1111 ◆No,2 2-2222 2-22222 ---------------------- <↓私が試しているコードです。> 'Test.txt 開く Open "C:\Test.txt" For Output As #File_Number '列Aのセルに空白文字列が入るまで、処理を繰り返す i = "3" Do While Worksheets("sheet1").Cells(i, 1) <> "" Print #File_Number, "◆" & Cells(i, 1) Print #File_Number, Cells(i, 2) i = i + 1 Loop 'Test.txt を閉じる Close #File_Number このマクロだとテキストでは ◆No,1 1-111111↑1-1111 ◆No,2 2-2222↑2-22222 となります。 アドバイスの程、よろしくおねがいします。

  • UNIXで、とあるテキストに対して2文字区切りで改行をいれるには?

    UNIXのシェルスクリプトで、このような動作ができないものかどうか考えています。 あるテキストファイルの内容を、2文字ごとに区切って改行を入れるように加工する 例えば file1.txt が以下のような内容であれば --file1.txt-- 000092 027301 01 0263000001 2文字ずつ区切って改行を挿入したファイル --file2.txt-- 00 00 92 02 73 01 01 02 63 00 00 01 を生成したいと思います。 ここで元のファイルは必ず、半角の数字のみで構成されており、 1行の文字数は最低2文字以上あり、なおかつ奇数個の文字列は存在しないものとします。 awk や grep や sed を組みあわせて考えているのですが、 なかなか解決に至りません。 どなたかお知恵を拝借願います。

  • 「」(かぎかっこ)は、段落として数えるのか

    文章で、段落の変わり目は、行頭を一マス下げると思います。 「」を使うときも、改行して行頭を一マス下げると思います。 では、段落を数えるとき、「」の行も、それだけで一つの段落と数えるものなのでしょうか。