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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

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

Q&A

解決済

6回答

6053閲覧

ls -l のスペース区切りをsedでタブ区切りに変換したい

miminashi

総合スコア22

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

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

0グッド

0クリップ

投稿2018/10/06 22:49

編集2018/10/06 23:42

ファイル名にスペースが出現するかもしれないので、8回目までの連続したスペースをタブに置換したいです。
いま以下のような感じで一応できていますが、POSIXの範囲内でもう少しスマートな方法があればご教授ください。

sh

1TAB="`printf '\t'`" 2ls -l | 3sed 's/ */'"${TAB}"'/1' | 4sed 's/ */'"${TAB}"'/1' | 5sed 's/ */'"${TAB}"'/1' | 6sed 's/ */'"${TAB}"'/1' | 7sed 's/ */'"${TAB}"'/1' | 8sed 's/ */'"${TAB}"'/1' | 9sed 's/ */'"${TAB}"'/1' | 10sed 's/ */'"${TAB}"'/1'

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

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

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

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

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

guest

回答6

0

つls -l|awk '{for(i=1;i<9;i++){printf "%s\t",$i}print $9}'

投稿2018/10/07 01:49

hichon

総合スコア5737

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

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

0

ベストアンサー

sedを使わず、shだけででやると、コマンド数は減りますね。見栄えがいまいちですが。

sh

1ls -l | 2while read a b c d e f g h i 3do echo "$a$TAB$b$TAB$c$TAB$d$TAB$e$TAB$f$TAB$g$TAB$h$TAB$i" 4done

sedで置換一回にするには、

sh

1ls -l | 2sed --posix 's/^([^ ]*) *([^ ]*) *([^ ]*) *([^ ]*) *([^ ]*) *([^ ]*) *([^ ]*) *([^ ]*) */\1\t\2\t\3\t\4\t\5\t\6\t\7\t\8\t/'

これもいまいちか。

ファイル名にスペースが出現するかもしれないので、

というのは、その後、プログラムで処理するためにタブにしたいという事でしょうか?
そのプログラム側で対応するのが良いと思います。

投稿2018/10/07 09:18

編集2018/10/07 09:41
otn

総合スコア84555

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

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

miminashi

2019/09/08 20:23

sedで素直に空白の繰り返しにマッチする正規表現を8個書くのがよさそうだなと思ったのでベストアンサーとさせていただきました
guest

0

POSIXの範囲内ではありませんし、時刻フォーマットがlsと違いますが、stat(1)一本で。

$ stat -c '%A %h %U %G %s %y %n' * -rw-r--r-- 1 masaka masaka 58253 2018-10-07 16:05:04.663725732 +0900 a b c -rw-r--r-- 1 masaka masaka 6287 2018-10-07 16:04:50.131785319 +0900 foo

投稿2018/10/07 07:11

emasaka

総合スコア524

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

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

miminashi

2019/09/08 20:26

GNUとBSDでオプションが揃っていたらstat(1)でも良かったのですが・・・
guest

0

perlじゃだめですかね。

ls -l | perl -ne '@a=split(/ +/, $_, 9); print join("\t", @a)'

投稿2018/10/07 04:13

KojiDoi

総合スコア13671

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

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

miminashi

2019/09/08 20:23

perlはちょっと・・・
guest

0

Mac で試しています。
ls-tsv.sh

sh

1#!/bin/bash 2 3\ls -al | grep -v "^total " | tr -s " " | tr " " "\t" | cut -s -f 1-8 > /tmp/1.txt 4\ls -a | grep -v "^total " > /tmp/2.txt 5\paste /tmp/1.txt /tmp/2.txt

ファイル名以外の列を TAB 区切りで作ります。
ファイル名だけを作ります。
この2つの結果を paste コマンドで TAB 区切りで連結します。

実行例
イメージ説明

イメージ説明

参考情報

https://qiita.com/kenju/items/5777322e485a30aa6269

投稿2018/10/07 01:29

編集2018/10/07 01:35
katoy

総合スコア22324

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

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

0

ls -l | sed 's/\s+/\t/g'

投稿2018/10/06 23:30

scsi

総合スコア2840

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

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

miminashi

2018/10/06 23:45

macOS, Ubuntu で試してみましたがだめでした macOSだとなにも置換されなくて、Ubuntuだと全部のスペースがタブに置換されました。
scsi

2018/10/07 00:01

Centos7では、大丈夫でしたので他は確認してませんでした。MAC持ってるので試してみますね
scsi

2018/10/07 00:10 編集

BSD系の sed は -E オプションで拡張正規表現が使えるようになるようです。 ls -l | sed -E 's/[ ]+/ /g' TAB は CTRL + v を押した後に tab を押してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問