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

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

ただいまの
回答率

91.02%

  • Linux

    3181questions

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

  • シェル

    230questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Linux シェルに関するご質問です。

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 262

linuxのシェルに関する質問です。

ファイルの行の先頭に何かの文字が入っています。
わかりやすいように「スペース」と表現しています。

この状態がファイルの複数の行で見られます。

kei@test ~ $cat a
スペースabcde
efg
スペースhijkl
スペースmn
opqrs
kei@test ~ $

ファイルが↑の状態である時、一括して行の先頭にある空白に見える文字を削除する方法はどんな方法がありますでしょうか?

「行の先頭にある空白」をファイルbへリダイレクトしています。
kei@test ~ $cat b

kei@test ~ $cat -e b
M-cM-^@M-^@M-cM-^@M-^@M-cM-^@M-^@M-cM-^@M-^@$
kei@test ~ $file b
b: UTF-8 Unicode text
kei@test ~ $

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2017/10/28 17:22

    一応LANGや(ひょっとしてディストリビューションも?)書いた方がよいかもです。LANG=ja_JP.UTF-8, Ubuntu16.04LTSとか・・・

    キャンセル

  • takatakee1028

    2017/10/28 17:23

    cygwinを使用しています。kei@test ~ $echo $LANG en_US kei@test ~ $

    キャンセル

  • KSwordOfHaste

    2017/10/28 17:34

    なるほど、cat -eの結果からすると全角スペースであることはわかりますが、LANG=ja_JP.UTF8にしても、sedに全角スペースをマッチさせられませんね・・・

    キャンセル

回答 5

checkベストアンサー

+3

既に解決済みなのですが、問題の文字がUTF-8の全角スペース(U+3000)なのでsuyamaさんの方法や[[:blank:]]も試してみたのですが、cygwinだからかどうかうまくいきませんでした。

ちょっとかえて次のようにするとできました。

LANG=ja_JP.UTF-8

sed -e 's/^ \+//' z

(わかりにくいですがパターンに全角スペースそのものを指定しています。この指定をするにはLANG=ja_JP.UTF-8になってないといけません)

なお、質問者さんのcygwinのLANGはja_JP.UTF-8になっていないので、日本語の全角文字をUTF-8として入力したり表示したりできません。UTF-8にするにはterminalのOptions>Textで、Locale=ja_JP, Character setをUTF-8にしてterminalを起動しなおしてみてください。


\u3000というパターンはマッチしないようです。またcygwin固有かどうかわかりませんが、+ではなく\+と書かなければならないようです。


一応環境についてなるべく書いておきます。比較的マイナーな環境のような気はしますが...

Windows 10
cygwin 2.877 (64bit)
LANG=ja_JP.UTF-8@cjknarrow (@の後ろはギリシャ文字の扱いの違いだそうですが自分はあまり意識してませんでした。terminalからUTF-8にすると自然にこうなります)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/28 18:11

    ありがとうございます!

    キャンセル

0

文字列の置換を行いたいということでしたら、sedコマンドでできる気がします。

sed -e s/置換条件/置き換え条件/ 対象ファイル

参考:シェル・スクリプト・リファレンス - 【 文字列を置換する「sed」 】:ITpro

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/28 16:27

    kei@test ~ $cat a
    スペースabcde
    efg
    スペースhijkl
    スペースmn
    opqrs
    kei@test ~ $

    シェルスクリプトでファイルをcatした状態が↑なので
    そこから、先頭行をにある文字を削除したいです。

    キャンセル

  • 2017/10/28 16:33

    sed -e s/スペース// a > b

    置換条件: スペース -> (なし)
    入力: a
    出力: b (というファイルに書き込む)

    こんな感じでしょうか。

    キャンセル

  • 2017/10/28 16:36

    説明が不足していて、すみません。
    "スペース"という表現は、わかりやすいように表示しているだけです。
    実際には、複数の空白があるように見えますが
    何かのコードが入っているみたいです。

    キャンセル

  • 2017/10/28 16:45

    大変失礼しました...
    解決法ではないのですが、
    scpで転送するなりして、エディタ等でまず何が入っているのかを確認するのはどうでしょうか。(できない環境でしたらごめんなさい)

    キャンセル

0

下記のようにするといかがでしょうか。

sed -e 's/^¥U3000+//g' b

再々度修正してみました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/28 16:26

    ダメでした。。

    キャンセル

  • 2017/10/28 16:37

    やっぱり、ダメでした。

    キャンセル

  • 2017/10/28 16:51

    od -c b | head -n20
    などのコマンド実行結果があると対応方法がわかるかもしれません。

    キャンセル

  • 2017/10/28 17:02

    kei@test ~ $od -c b
    0000000 ▒ 200 200 ▒ 200 200 ▒ 200 200 ▒ 200 200 \n
    0000015
    kei@test ~ $

    キャンセル

  • 2017/10/28 17:21

    200は0x80のことなので、これを除去すれば対応できそうです。
    トーンのように見えるものは文字コードがふめいなため、下記で再実行頂けますか?

    od -x b

    キャンセル

  • 2017/10/28 17:25

    kei@test ~ $od -x b
    0000000 80e3 e380 8080 80e3 e380 8080 000a
    0000015
    kei@test ~ $

    キャンセル

  • 2017/10/28 17:28

    あるいは、通常の文字が各行に2文字以上あるのであれば、下記でもよいかもしれません。

    strings -2 a

    キャンセル

  • 2017/10/28 17:36

    ありがとうございます。
    「行の先頭にある空白」を除去できました。

    自分の説明不足ですが、実は、ファイル内に日本語の文字があり
    それが、消えています。
    それを表示させることは可能でしょうか?

    キャンセル

  • 2017/10/28 17:38

    cat -eの結果(0xe3 0x80 0x80)からUTF-8の全角スペース(U+3000)のようです。質問コメントにも書きましたがcygwinのsedでこれをひっかける方法がわかりません ><

    キャンセル

  • 2017/10/28 17:47

    試せていないので使えるかわかりませんが、再度修正してみました。

    キャンセル

  • 2017/10/28 17:52

    kei@test ~ $sed -e 's/^\U3000+//g' b
        
    kei@test ~ $

    ダメみたいです。

    キャンセル

  • 2017/10/28 17:59

    なかなか上手くいかないですね。
    回答でのUを小文字とするか、下記のようにすると指定できるのでしょうか。

    sed "s/(echo -ne '\u3000')//g" b

    キャンセル

0

一例ですが、sedコマンドが使えます。
例えば行の先頭が0個以上の空白文字があるcontent.txtと言う名前のファイルがあったとして、

$ cat content.txt
    LINE1
   LINE2
LINE3
        LINE4

$ sed -e 's/^[[:space:]][[:space:]]*//g' content.txt
LINE1
LINE2
LINE3
LINE4


となります。

追記 私の先の回答にバグがあったので修正させていただきました。

置換したいのであれば、例えば"PREFIX-"に置換するとして、

$ sed -e 's/^[[:space:]][[:space:]]*/PREFIX-/g' content.txt
PREFIX-LINE1
PREFIX-LINE2
LINE3
PREFIX-LINE4


となります。
元のテキストファイルがUTF-8だとして、スペースは20h, 全角のスペースだと e3h 80h 80hのシーケンスになるかと思うのですが、私のmac osxのターミナル環境下(LANG=ja_JP.UTF-8)ですとUTF-8全角スペースでもsedの[[:space::]]メタ文字指定で除去できてしまいましたね。 

bash-3.2$ file content.txt 
content.txt: UTF-8 Unicode text
bash-3.2$ cat content.txt 
 LINE1
  LINE2
LINE3
  LINE4
      LINE5

bash-3.2$ od -t xC content.txt 
0000000    20  4c  49  4e  45  31  0a  20  20  4c  49  4e  45  32  0a  4c
0000020    49  4e  45  33  0a  20  e3  80  80  4c  49  4e  45  34  0a  e3
0000040    80  80  e3  80  80  e3  80  80  e3  80  80  20  20  4c  49  4e
0000060    45  35  0a  0a                                                
0000064
bash-3.2$ sed -e 's/^[[:space:]][[:space:]]*/PREFIX-/g' content.txt
PREFIX-LINE1
PREFIX-LINE2
LINE3
PREFIX-LINE4
PREFIX-LINE5


他の回答者様が暗にご指摘になっているように、行頭の空白文字の種類として何が入っているか、が問題ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/28 16:32

    一見、単なる空白に見えますが、そうではないので
    そのコマンドでは、削除できないです。

    BOMでもないので、何なと不明な状態で、自分が調べたログも記載しています。

    キャンセル

  • 2017/10/28 16:57

    ↑の方法でも、ダメでした。
    「行の先頭にある空白」の除去をしたいです。
    置換といえば、置換ですが。

    キャンセル

  • 2017/10/28 17:39

    自己レスですが、既にsuyama様のコメントで結論が出ていたようです。大変失礼しました。

    キャンセル

0

やりたいのは、こういうことじゃないですか?

sed 's/[\x01-\x1f]//g' b

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/28 16:51

    ダメでした。。

    キャンセル

  • 2017/10/28 17:00

    どうダメだったのかを具体的に書いてください。我々はあなたの文章からしか状況を推測することができないのです。

    キャンセル

  • 2017/10/28 17:03

    すみません。
    何も変わらなかったです。

    キャンセル

  • 2017/10/28 17:04

    kei@test ~ $cat b
        
    kei@test ~ $sed 's/[\x01-\x1f]//g' b
        
    kei@test ~ $

    キャンセル

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3181questions

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

  • シェル

    230questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。