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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/28 07:43
2017/10/28 08:22
2017/10/28 08:23
2017/10/28 08:34
回答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総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
やりたいのは、こういうことじゃないですか?
sed 's/[\x01-\x1f]//g' b
投稿2017/10/28 07:48
総合スコア13669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/28 07:51
2017/10/28 08:00
2017/10/28 08:03
2017/10/28 08:04
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総合スコア9183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/28 07:32
2017/10/28 07:57
2017/10/28 08:39
0
下記のようにするといかがでしょうか。
bash
1sed -e 's/^¥U3000+//g' b
再々度修正してみました。
投稿2017/10/28 07:24
編集2017/10/28 08:46退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/28 07:26
2017/10/28 07:37
退会済みユーザー
2017/10/28 07:51
2017/10/28 08:02
退会済みユーザー
2017/10/28 08:21
2017/10/28 08:25
退会済みユーザー
2017/10/28 08:28
2017/10/28 08:36
2017/10/28 08:38
退会済みユーザー
2017/10/28 08:47
2017/10/28 08:52
退会済みユーザー
2017/10/28 08:59
0
文字列の置換を行いたいということでしたら、sedコマンドでできる気がします。
bash
1sed -e s/置換条件/置き換え条件/ 対象ファイル
投稿2017/10/28 07:24
編集2017/10/28 07:25退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/28 07:27
退会済みユーザー
2017/10/28 07:33
2017/10/28 07:36
退会済みユーザー
2017/10/28 07:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。