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

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

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

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

シェル

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

Q&A

解決済

5回答

3271閲覧

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

takatakee1028

総合スコア7

Linux

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

シェル

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

0グッド

1クリップ

投稿2017/10/28 07:15

編集2017/10/28 07:41

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 ~ $

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

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

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

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

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

KojiDoi

2017/10/28 07:35

「先頭行にある空白」というと普通は「第1行目にある空白」という意味になりますよ。ここでやりたいのは「行の先頭にある空白」の除去ですよね。このほかにも、「行頭にあるスペースを、文字をファイルbへリダイレクト」とか、意味の取りにくい文を含めないように推敲をお願いします。
takatakee1028

2017/10/28 07:43

すみません。修正しました。
KSwordOfHaste

2017/10/28 08:22

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

2017/10/28 08:23

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

2017/10/28 08:34

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

回答5

0

ベストアンサー

既に解決済みなのですが、問題の文字が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 08:59

編集2017/10/28 09:48
KSwordOfHaste

総合スコア18392

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

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

guest

0

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

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

投稿2017/10/28 07:48

KojiDoi

総合スコア13669

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

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

KojiDoi

2017/10/28 08:00

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

2017/10/28 08:03

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

2017/10/28 08:04

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

0

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

Bash

1$ cat content.txt 2 LINE1 3 LINE2 4LINE3 5 LINE4 6 7$ sed -e 's/^[[:space:]][[:space:]]*//g' content.txt 8LINE1 9LINE2 10LINE3 11LINE4

となります。

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

置換したいのであれば、例えば"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

1bash-3.2$ file content.txt 2content.txt: UTF-8 Unicode text 3bash-3.2$ cat content.txt 4 LINE1 5 LINE2 6LINE3 7  LINE4 8     LINE5 9 10bash-3.2$ od -t xC content.txt 110000000 20 4c 49 4e 45 31 0a 20 20 4c 49 4e 45 32 0a 4c 120000020 49 4e 45 33 0a 20 e3 80 80 4c 49 4e 45 34 0a e3 130000040 80 80 e3 80 80 e3 80 80 e3 80 80 20 20 4c 49 4e 140000060 45 35 0a 0a 150000064 16bash-3.2$ sed -e 's/^[[:space:]][[:space:]]*/PREFIX-/g' content.txt 17PREFIX-LINE1 18PREFIX-LINE2 19LINE3 20PREFIX-LINE4 21PREFIX-LINE5

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

投稿2017/10/28 07:28

編集2017/10/28 08:36
dodox86

総合スコア9183

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

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

takatakee1028

2017/10/28 07:32

一見、単なる空白に見えますが、そうではないので そのコマンドでは、削除できないです。 BOMでもないので、何なと不明な状態で、自分が調べたログも記載しています。
takatakee1028

2017/10/28 07:57

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

2017/10/28 08:39

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

0

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

bash

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

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

投稿2017/10/28 07:24

編集2017/10/28 08:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/10/28 07:51

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

2017/10/28 08:02

kei@test ~ $od -c b 0000000 ▒ 200 200 ▒ 200 200 ▒ 200 200 ▒ 200 200 \n 0000015 kei@test ~ $
退会済みユーザー

退会済みユーザー

2017/10/28 08:21

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

2017/10/28 08:25

kei@test ~ $od -x b 0000000 80e3 e380 8080 80e3 e380 8080 000a 0000015 kei@test ~ $
退会済みユーザー

退会済みユーザー

2017/10/28 08:28

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

2017/10/28 08:36

ありがとうございます。 「行の先頭にある空白」を除去できました。 自分の説明不足ですが、実は、ファイル内に日本語の文字があり それが、消えています。 それを表示させることは可能でしょうか?
KSwordOfHaste

2017/10/28 08:38

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

退会済みユーザー

2017/10/28 08:47

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

2017/10/28 08:52

kei@test ~ $sed -e 's/^\U3000+//g' b      kei@test ~ $ ダメみたいです。
退会済みユーザー

退会済みユーザー

2017/10/28 08:59

なかなか上手くいかないですね。 回答でのUを小文字とするか、下記のようにすると指定できるのでしょうか。 sed "s/(echo -ne '\u3000')//g" b
guest

0

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

bash

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

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

投稿2017/10/28 07:24

編集2017/10/28 07:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takatakee1028

2017/10/28 07:27

kei@test ~ $cat a スペースabcde efg スペースhijkl スペースmn opqrs kei@test ~ $ シェルスクリプトでファイルをcatした状態が↑なので そこから、先頭行をにある文字を削除したいです。
退会済みユーザー

退会済みユーザー

2017/10/28 07:33

sed -e s/スペース// a > b 置換条件: スペース -> (なし) 入力: a 出力: b (というファイルに書き込む) こんな感じでしょうか。
takatakee1028

2017/10/28 07:36

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

退会済みユーザー

2017/10/28 07:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問